wiki.straybombay.com straybombay_mediawiki http://wiki.straybombay.com/Main_Page MediaWiki 1.37.1 first-letter Media Special Talk User User talk Wiki.straybombay.com Wiki.straybombay.com talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Main Page 0 1 1 2022-03-15T13:06:10Z MediaWiki default 2 wikitext text/x-wiki <strong>MediaWiki has been installed.</strong> Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software. == Getting started == * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] 11cef88175cf81168a86e7c0327a5b2d7a1920f5 2 1 2022-04-02T06:30:37Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] d6b1c809cf993fa929fc20fe8b9f2efc88b9abc8 3 2 2022-04-04T03:36:05Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == * Quick Start - Making A Map * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] f108f5da426f1407aab5e82af40b23d60d2252fe 4 3 2022-04-04T03:40:03Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == * Quick Start - [[Making A Map]] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] b222bd913a7d566c4d6f0d2f89f88f1a579c39f3 24 4 2022-05-01T22:28:25Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == * Quick Start - Step One: [[Making A Map]] - Step Two: [[Blocking Out A Map]] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] 58b5808e21a52ae54e4eb52821bf922a99afb918 45 24 2022-05-02T06:55:16Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == ** Step One: [[Making A Map]] ** Step Two: [[Blocking Out A Map]] fa4b68aa8014bb6f05a648f44936e35b435a75a0 46 45 2022-05-02T06:55:31Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == # Step One: [[Making A Map]] # Step Two: [[Blocking Out A Map]] c23673ee95affaabc08b7a888cbeb8ac6f4cb895 47 46 2022-05-02T07:21:56Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == # Step One: [[Making A Map]] # Step Two: [[Blocking Out A Map]] [[Holdout Quickstart Guide]] 2ba27e236813cf318240d7e0bf3192ec975a12e6 File:Create directory map.png 6 2 5 2022-04-04T05:17:15Z Chet 3 our first directory and map. wikitext text/x-wiki == Summary == our first directory and map. 815084af094ed901bc103680874a92d8cd50e01d Making A Map 0 3 6 2022-04-04T05:22:01Z Chet 3 Created page with "How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is s..." wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. In this instance, we created a directory ChetTest and then right clicked and chose to create a new level. We named it FirstMap. [[File:http://wiki.straybombay.com/images/thumb/e/e8/Create_directory_map.png/800px-Create_directory_map.png]] # First start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP' # Place the airlock at 0,0,0 in world space. # Next place the airlock weapons & items by placing this blueprint in the same location as the geometry: Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' ## Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. # Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 6f5dd1cc69edf37ad2d89fe8039bdcfed15db093 9 6 2022-04-04T05:34:46Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. In this instance, we created a directory ChetTest and then right clicked and chose to create a new level. We named it FirstMap. [[File:http://wiki.straybombay.com/images/thumb/e/e8/Create_directory_map.png/800px-Create_directory_map.png]] Double click on the map file and it will open it up to an all black screen. Don't worry, that's normal - let's put something there! Let's start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just "ISO_airlock_start_BP" in the Place Actors search bar and it will show up. [[File:http://wiki.straybombay.com/images/9/99/PlacingTheAirlock_1.PNG]] Just left click on the file and drag it into your main view port (the big black window!) Let's now move that to 0,0,0 in the world space. You can do that by going into details and putting 0,0,0 in the location X,Y,Z. [[File:http://wiki.straybombay.com/images/thumb/5/5f/Centeringfirstairlock.PNG/551px-Centeringfirstairlock.PNG]] Next place the airlock weapons & items by repeating this process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' ## Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. # Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 601926bf3331002409bbdd16c71f1e0d9ffa76f0 11 9 2022-04-05T05:06:20Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it FirstMaps. Go into that directory and right click and choose to create "New Level" and name that FirstMap. Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! Start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[File:Firstmap setup addingairlock.PNG]] Just left click on the file and drag it into your main view port (the big black window!) Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [File:Centeringfirstairlock.PNG] Next place the airlock weapons & items. This time let's navigate to by repeating this process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' ## Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. # Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 78b4e8b987d3aef96bf38f6fdaad8c91848ce81f 12 11 2022-04-05T05:07:56Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it FirstMaps. Go into that directory and right click and choose to create "New Level" and name that FirstMap. Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! Start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[File:Firstmap setup addingairlock.PNG |left|]] Just left click on the file and drag it into your main view port (the big black window!) Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [File:Centeringfirstairlock.PNG] Next place the airlock weapons & items. This time let's navigate to by repeating this process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' ## Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. # Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 328f483ac94352172e398c1bdade6fbdc5348b60 13 12 2022-04-05T05:27:44Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it FirstMaps. Go into that directory and right click and choose to create "New Level" and name that FirstMap. Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! Start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] Just left click on the file and drag it into your main view port - the big black window! Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] These two objects should be laid over each other. Next place the airlock weapons & items. Repeating this process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 5aa3e2f9b62523676d2e0f93c61e228cfc33b0f9 14 13 2022-04-05T05:42:29Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. First you need to create your base map file. To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it FirstMaps. Go into that directory and right click and choose to create "New Level" and name that FirstMap. Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! Start by placing the airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] Just left click on the file and drag it into your main view port - the big black window! Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] These two objects should be laid over each other. Next place the airlock weapons & items. Repeating this process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: cbcf2a8fb76a0750df7308855fae3241a401c696 15 14 2022-04-11T04:05:32Z 97.113.85.226 0 /* Creating your first Map */ wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it FirstMaps. **Go into that directory and right click and choose to create "New Level" and name that FirstMap. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: 29d5a862472bcd5b53bfb184b326666f4b86c415 17 15 2022-04-11T04:44:26Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content, create a maps directory if there isn't one by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it FirstMaps. **Go into that directory and right click and choose to create "New Level" and name that FirstMap. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. [ bd9da6d6aef5b692713a8b104895a9305c6b0d2c 18 17 2022-04-26T05:48:57Z Chet 3 /* Creating your first Map */ wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. 6ffb4a06affe6a01f5e6b9af25b204373d4459c5 19 18 2022-04-26T06:00:44Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. 0dbecbeb7244b42178d92a4b9bc4adf911a8c00d 20 19 2022-04-26T06:30:54Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. 92229df7fb91bde107e7f77b17f5b59714b97e07 21 20 2022-04-26T06:38:18Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. b61bb15474f45f7c2a197bbeccf15693cce5471f 22 21 2022-04-26T07:13:41Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 20171170babf1d60a75f4d6e1a68689cab3261a2 23 22 2022-04-26T07:16:57Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Setting up the Airlocks=== *First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 4d5b0e2955e8265d3c6e0d6124e29ac3b41055d3 File:PlacingTheAirlock 1.PNG 6 4 7 2022-04-04T05:26:57Z Chet 3 Searching for the airlock wikitext text/x-wiki == Summary == Searching for the airlock 1d70b82d5d1bdb903296ac761ee5b65f16466418 File:Centeringfirstairlock.PNG 6 5 8 2022-04-04T05:31:22Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Firstmap setup addingairlock.PNG 6 6 10 2022-04-05T05:05:19Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Firstmap levels addexisting.PNG 6 7 16 2022-04-11T04:35:41Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Blocking Out A Map 0 8 25 2022-05-01T22:32:14Z Chet 3 Created page with "In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, “Quick Start.” ===Blockout===" wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, “Quick Start.” ===Blockout=== 66732abfecebc713fcf9204e934b02fe3f7f72f5 26 25 2022-05-01T22:33:48Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== 31519fee9fb8be453630f2a2921ca8c87435c807 27 26 2022-05-01T22:36:42Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: *We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. *Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. *Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: **Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed. **These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s). **This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush. 0d4381d0ecf2bfd12682c503351944740541b41c 28 27 2022-05-01T22:37:40Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: #We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. #Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. #Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: ##Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed. ##These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s). ##This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush. 1d6a5e66ede5c323147327d971920b086fcb68c0 29 28 2022-05-01T22:40:23Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: #We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. #Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. #Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: ##Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed. ##These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s). ##This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush. f702778d6691a7933a402b2556dd822b742e2729 30 29 2022-05-01T22:59:47Z Chet 3 /* Blockout */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. </li> d4cf40e11e3fa529e17db49aca735b33fec32512 31 30 2022-05-02T03:29:13Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></lo> ===Tools for blocking out geometry:=== </li> 45a3420fb4c5b4326763cc1540aa9b0bcd3020a6 32 31 2022-05-02T03:29:36Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></lo> ===Tools for blocking out geometry:=== c99756c139d91bc1eb59c6f35a3f3db60952132f 33 32 2022-05-02T03:30:01Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol> ===Tools for blocking out geometry:=== b54fd646aa88a99d3c073b081614a9d35fdbb286 34 33 2022-05-02T03:30:20Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== 81b8d6953f0c1fefdf31edf0bfdb750ab9770977 35 34 2022-05-02T03:33:06Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. <li>Blockout Tool - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. fe87d8ae348ce428b847d8b45fba4153ccf30be7 36 35 2022-05-02T03:33:42Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>Blockout Tool - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> 9416aa775cfe2cec86f218d537ae908ef277e846 37 36 2022-05-02T03:35:37Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> 8a8739dbc4cab0bbec989a812d1cfaeb08cd7597 38 37 2022-05-02T04:01:37Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout: 3d3ef58fad25614b0be302c109ef2355d5f6e46c 39 38 2022-05-02T05:57:00Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: 245dd6cd6eeb7dee6e9ed614fc54d4e604db9b63 40 39 2022-05-02T05:59:22Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. 0eb702889ae8ea8c959262ed84e55803a89357be 41 40 2022-05-02T06:42:21Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes<b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. <b>Blockout Lighting</b> At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: <b>Iterate!</b> That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 554f6b2f2ff5f3d7d463c011ad81131c290708f8 42 41 2022-05-02T06:42:51Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. <b>Blockout Lighting</b> At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: <b>Iterate!</b> That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 8777df882fa07655aa68f7ad123e03d74dc1894e 43 42 2022-05-02T06:43:07Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. <b>Blockout Lighting</b> At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: <b>Iterate!</b> That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' e51e4a9a1490335431ab3437d3fed89c7135e555 44 43 2022-05-02T06:44:09Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. ===Here we have a quick blockout=== - LINK AND IMAGE - This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: IMAGE HERE Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: IMAGE If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: IMAGE Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. <b>Path Buddies</B> If you build the context now and turn on the golden path you’ll see some areas with black tiles: IMAGES These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 83cfa9689b5ff206afdf54fc1378b53bca2aecff Holdout Quickstart Guide 0 9 48 2022-05-02T07:36:16Z Chet 3 Created page with "This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we..." wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin:auto" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin:auto" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin:auto" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} 085bb936b83585c6a67ec5beaffddf74090999a6 49 48 2022-05-02T07:39:59Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin:auto" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin:auto" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} c5c37efc66e4db607edd59f1cf8d2b1b6e9eee71 50 49 2022-05-02T07:40:27Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} 1dbd11c0489a4c3d4f02fb5ae06b3e7124f45c75 Holdout Quickstart Guide 0 9 51 50 2022-05-02T07:41:13Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner a17abaaf27add895f89471a7252ac3341da9881d 52 51 2022-05-02T07:48:15Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} 0ed261bad30dfe2c2080feacc00767565333d93a 53 52 2022-05-02T07:52:27Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} 66a29ae1df278ad112f876fedb3fc479b1d22cd4 54 53 2022-05-02T07:57:59Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} fb4f5ac69fb4727941ef822bfcc76923b59b56ee 60 54 2022-05-02T17:34:49Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} be083a249ddc7c6f588e6f7230f0d5801b11ff97 61 60 2022-05-02T17:36:48Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:Downtimecurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:waveoutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} 13e5331df1ad4ad0c5a1948129ab39725e7fff32 62 61 2022-05-02T17:37:27Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} f24afd2b0fb151e6352b17b079302f08dbf115b3 65 62 2022-05-02T17:41:35Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:“HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:“GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData Link Trigger_BeginPlay to Trigger_SetHoldoutData Then over on our Trigger_SetHoldoutData setup the holdout config, you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} f4f3c848867a252e30b86383fb9060576fa96c1c 70 65 2022-05-02T17:46:56Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} 4538e8c195eb4e1aa675f8b41ae6c9d622184eb0 72 70 2022-05-02T17:49:38Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. So First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branchs one tagged as Campaign and one Tagged as Holdout Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} da879b7f48d4da773a6573441aa1383d0d6b7214 80 72 2022-05-02T17:57:36Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |- | [[file:TriggerBranch2.png]] |- | [[file:TriggerBranch3.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} 13665316c5397825583f1a55f2cda5133897878e 83 80 2022-05-02T18:03:12Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave1.png]] |} Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} f3871aac94d3b9f7a739b54b427867358d3c0157 84 83 2022-05-02T18:14:21Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave1.png]] |} Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} 1ce4e23e3dd3744e9a743683bd065f0a1dd34802 86 84 2022-05-02T18:15:52Z Chet 3 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, lets make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 4 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve=== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveTime== A curve data asset that dictates how long each wave is {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Time |- | [[file:wavetime.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==DowntimeCurve== A curve data asset that dictates how long the downtime is at the end of each wave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DowntimeCurve.png]] |} The x-axis in our case is “CurrentWave”, and the y-axis is time in seconds ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Start Offline || Should the connected MCs start offline? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart.png]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. ==Doing things on a certain wave== To activate things on a wave, you need a Trigger_BranchHoldoutWave and Trigger_Holdout and link them up {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave1.png]] |} Once Linked we can link any object we want on our Trigger_BranchHoldoutWave {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BranchHoldoutWave2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Triggers |- ! Variable !! Info |- | Target Wave || The target wavesfor the activation list to activate |} fcf366d896b4ac0b963eca725ece625e26581a65 File:DifficultyCurve.png 6 10 55 2022-05-02T17:23:06Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:DifficultyCurve2.png 6 11 56 2022-05-02T17:33:11Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Wavetime.png 6 12 57 2022-05-02T17:33:27Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:DowntimeCurve.png 6 13 58 2022-05-02T17:33:38Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:WaveOutline.png 6 14 59 2022-05-02T17:33:47Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:HoldoutPlayerStart.png 6 15 63 2022-05-02T17:38:47Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:SettingUpSpawns.png 6 16 64 2022-05-02T17:38:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:GunsAndAmmo.png 6 17 66 2022-05-02T17:41:54Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger SetHoldoutData2.png 6 18 67 2022-05-02T17:44:52Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger SetHoldoutData.png 6 19 68 2022-05-02T17:45:00Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger BeginPlay.png 6 20 69 2022-05-02T17:45:09Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:MatterCompilers.png 6 21 71 2022-05-02T17:49:21Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger HoldoutLootManager.png 6 22 73 2022-05-02T17:50:32Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Panel RequireAllPlayers.png 6 23 74 2022-05-02T17:51:33Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:StartVolumes.png 6 24 75 2022-05-02T17:53:43Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger Branch.png 6 25 76 2022-05-02T17:55:07Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:TriggerBranch3.png 6 26 77 2022-05-02T17:56:32Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:TriggerBranch2.png 6 27 78 2022-05-02T17:56:39Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:TriggerBranch1.png 6 28 79 2022-05-02T17:56:47Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger BranchHoldoutWave1.png 6 29 81 2022-05-02T17:59:43Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger BranchHoldoutWave2.png 6 30 82 2022-05-02T17:59:53Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:RequireAllPlayersToActivate.png 6 31 85 2022-05-02T18:15:02Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Trigger HoldoutModeStart.png 6 32 87 2022-05-02T18:16:59Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Tutorial 01.PNG 6 33 88 2022-05-03T03:53:32Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Making A Map 0 3 89 23 2022-05-03T04:01:45Z Chet 3 wikitext text/x-wiki How newbie do we go? Talk about directories etc? What is the experience coming from source? ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.png]] |} **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap d0911a3976bf19973656d4ae45435b26cd03a5f6 90 89 2022-05-03T04:01:57Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.png]] |} **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap ebb079d3f98e74242a390657fc84b2f50f777a2e 91 90 2022-05-03T04:02:48Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial 01.PNG] |} **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap e238b67a988d4bd1d573517f4e67e887c63682df 92 91 2022-05-03T04:03:39Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. **To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. **Now create your test directory, let's name it Test. **Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} **Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! *Placing the airlock geometry in your level. **This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. [[:File:Firstmap setup addingairlock.PNG|(Adding Airlock Image)]] **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 203721d494249b962fab153c3d577f6a384248cd 93 92 2022-05-03T04:06:30Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ==Placing the airlock geometry== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} **Just left click on the file and drag it into your main view port - the big black window! ** Let's now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[:File:Centeringfirstairlock.PNG|(Centering Airlock Image)]] *Next place the airlock weapons & items. **Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' **These two objects should be laid over each other. **Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. *Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[:File:Firstmap levels addexisting.PNG] **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 7766db020e7377ef47b04ec4bb39b70be022150f 94 93 2022-05-03T04:12:44Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ==Placing the airlock geometry== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} **Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. **This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). **Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap afdd9b8ab72b9deb3c16fe6bffb2af6aab313be0 96 94 2022-05-03T04:18:31Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ==Placing the airlock geometry== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} *You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. *Now you’re ready to start blocking in your level. Before we do that however let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. **We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. **Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. *Let's add some temporary light! **From the Place Actors menu type in directional light and drag it onto the scene. **This can be located anywhere and we will just use the defaults. *Let's setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. **Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. **Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap f4e1407516fdee55e567696ceb2f947c5b9c100b 98 96 2022-05-03T04:29:02Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ==Placing the airlock geometry== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} **Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. **Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. **Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap a6a8a3fd7674139ba41de68782913a270b497a01 100 98 2022-05-03T04:34:52Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ==Placing the airlock geometry== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) **Press P and you should see your map covered in green. *Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Driver (Enemy & Item Spawning)=== The driver is what we used to automatically break down the world so the game knows where a map starts and ends, and understand where enemies & items can spawn. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! *First let’s create a new sublevel to place the driver related actors. In level browser select the level drop down and select new: Choose empty level and let's name it Test_Context and save it in the same directory as your Test map. **The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! **Set this new sub level to Always Loaded from the level browser. *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: *Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. *Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap f051308a3ca991b8f36933e23678b59ffefe9ee8 File:TutorialChangeStreaming.PNG 6 34 95 2022-05-03T04:17:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Tutorial01 Copy.PNG 6 35 97 2022-05-03T04:27:59Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Tutorial01 Summon.PNG 6 36 99 2022-05-03T04:33:12Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:GreenNavigation.PNG 6 37 101 2022-05-03T04:49:38Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Making A Map 0 3 102 100 2022-05-03T04:57:57Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. *In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. *Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. *Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 55cf3d95186fa0d43ee66ff52430d76225f70086 104 102 2022-05-03T05:04:42Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: *This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths *The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. *If you press Alt + P to play you should now have enemies & items spawning in your map. *You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. *Make sure to save all or at least the context and the main map. *A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 398fccc8569fc0328a82a64f84d40377aa59ae28 106 104 2022-05-03T05:23:47Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial_01.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 3566a17e699e0b97c9fd340d0d439efafcfeedce 132 106 2022-05-06T04:01:10Z Chet 3 /* Creating your Level File */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is setting up the map start. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstlevel.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 21903f9af96a18d5bf73c59545cee03bebdd6ea0 133 132 2022-05-06T04:02:29Z Chet 3 /* Creating your first Map */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to content -> Maps. For this example we are going to put our map directory in Station_1 folder and create a new folder by right clicking in the empty window and choose New Folder from the top of the menu. Now create your test directory, let's name it Test. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstlevel.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap dd984d2f85dd329f2bd2751a66f7039c548f38b1 134 133 2022-05-06T04:03:34Z Chet 3 /* Creating your Level File */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstlevel.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. This is setup as a blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. In Unreal, you can just type "ISO_airlock_start_BP" in the content browser search bar and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 311bbc79bba39c44bf9706edb3b9b52120054cd5 135 134 2022-05-06T04:09:56Z Chet 3 /* Placing the airlock geometry */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstlevel.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 0dfe43f0285da27caeb00fe4ded2141f04269c09 136 135 2022-05-06T05:06:57Z Chet 3 /* Setup the Director */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstlevel.PNG]] |} Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap setup addingairlock.PNG]] |} Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Centeringfirstairlock.PNG]] |} Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Firstmap levels addexisting.PNG]] |} Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TutorialChangeStreaming.PNG]] |} You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Copy.PNG]] |} Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Tutorial01_Summon.PNG]] |} This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GreenNavigation.PNG]] |} Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartBuddy.PNG]] |} Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:GoldenPath.PNG]] |} If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 036cfbc8aa944c63662fb9fb3f9ed9a3f7e9d80b File:StartBuddy.PNG 6 38 103 2022-05-03T04:59:28Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:GoldenPath.PNG 6 39 105 2022-05-03T05:17:48Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:CreateMod.png 6 40 107 2022-05-04T17:35:11Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 126 107 2022-05-06T02:52:13Z Chet 3 Chet uploaded a new version of [[File:CreateMod.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:ModToolBarCreate.png 6 41 108 2022-05-04T17:37:38Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:ModContentBrowser.png 6 42 109 2022-05-04T17:42:25Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:NewDataAsset.png 6 43 110 2022-05-04T17:46:58Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:ModInfo.png 6 44 111 2022-05-04T17:48:12Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 113 111 2022-05-04T17:51:16Z StrayDanger 5 StrayDanger uploaded a new version of [[File:ModInfo.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:SelectModInfoDataAsset.png 6 45 112 2022-05-04T17:48:30Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Creating a Mod 0 46 114 2022-05-04T17:52:34Z StrayDanger 5 Created page with "== Getting started == First, make sure you have The Anacrusis Mod Kit installed and running. Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[File:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[File:CreateMod.png]] == Your Workspace == Once your mod is created, you should see a new top-le..." wikitext text/x-wiki == Getting started == First, make sure you have The Anacrusis Mod Kit installed and running. Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[File:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[File:CreateMod.png]] == Your Workspace == Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" [[File:ModContentBrowser.png]] Everything for your mod has to be within this folder or it will not be bundled when you package your mod. == Setting up the Mod Info == For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[File:NewDataAsset.png]] Select ModInfo [[File:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[File:ModInfo.png]] d14817a0642612dae36d2ad72a5ed75fb574a265 115 114 2022-05-04T17:53:29Z StrayDanger 5 wikitext text/x-wiki == Getting started == First, make sure you have The Anacrusis Mod Kit installed and running. Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[File:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[File:CreateMod.png]] == Your Workspace == Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" [[File:ModContentBrowser.png]] Everything for your mod has to be within this folder or it will not be bundled when you package your mod. == Setting up the Mod Info == For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[File:NewDataAsset.png]] Select ModInfo [[File:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[File:ModInfo.png]] 612583d2121d72cafd16a6f85322c20ce31b8e11 Main Page 0 1 116 47 2022-05-06T02:38:30Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] [[Holdout Quickstart Guide]] aa56de349320e3eb9e66b3b884d8b66cb09200be File:Preset1Capture.PNG 6 47 117 2022-05-06T02:40:50Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Preset2.PNG 6 48 118 2022-05-06T02:41:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Preset3.PNG 6 49 119 2022-05-06T02:42:55Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Installing the Mod Kit 0 50 120 2022-05-06T02:43:42Z Chet 3 Created page with "First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | file:Pres..." wikitext text/x-wiki First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} 83bc67289bacd436b1245d3dfcafbff7e30b09f9 121 120 2022-05-06T02:46:04Z Chet 3 wikitext text/x-wiki First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:ModToolBarCreate.png]] |} bf40b510c80b682b0264f93f31290fea81abe904 123 121 2022-05-06T02:47:42Z Chet 3 wikitext text/x-wiki First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:episodestart.PNG]] |} 855757a0364410f50211f660b37feb44304a7b68 124 123 2022-05-06T02:49:47Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file::CreateMod.png]] |} ==Setting up your workspace== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" 21a68656c4e6198c50878fe3ab3e601bac5bf60d 125 124 2022-05-06T02:51:15Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ==Setting up your workspace== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" 7049fa985a23d765ecfbb918eb5a7bfef07a9f99 127 125 2022-05-06T02:54:08Z Chet 3 wikitext text/x-wiki ===Setting up the Mod=== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModContentBrowser.png]] |} 45453482ad66cdbb37526844781a69be057023c6 128 127 2022-05-06T02:54:50Z Chet 3 wikitext text/x-wiki ===Setting up the Mod=== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModContentBrowser.png]] |} ===Setting up the Mod Info=== 5c13594e1477741a28efab15217c297666c51225 129 128 2022-05-06T03:10:18Z Chet 3 wikitext text/x-wiki ===Setting up the Mod=== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModContentBrowser.png]] |} ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:NewDataAsset.png]] |} e5c792d0064fee753db8c5bbf4ba73fd1cf34c9b 130 129 2022-05-06T03:58:14Z Chet 3 wikitext text/x-wiki ===Setting up the Mod=== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModContentBrowser.png]] |} ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:NewDataAsset.png]] |} Select ModInfo {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:SelectModInfoDataAsset.png]] |} You can name this whatever you like, once created open it up and fill out the info {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModInfo.png]] |} One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. 3ae1621aae345ce7004ff09f3bdf633f470c3e82 137 130 2022-05-06T17:14:37Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModContentBrowser.png]] |} ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:NewDataAsset.png]] |} Select ModInfo {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:SelectModInfoDataAsset.png]] |} You can name this whatever you like, once created open it up and fill out the info {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModInfo.png]] |} One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. ea22570d0de87dcf8290422ed9f16dfa3a6bfdf4 File:Episodestart.PNG 6 51 122 2022-05-06T02:47:20Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Firstlevel.PNG 6 52 131 2022-05-06T04:01:01Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Blockout.png 6 53 138 2022-05-06T17:16:54Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png 6 54 139 2022-05-06T17:18:16Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png 6 55 140 2022-05-06T17:19:53Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:168498de-bfae-463a-8a0c-ccb0ed6256ab.png 6 56 141 2022-05-06T17:20:32Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:3778b4c2-2933-4fda-8875-effbc623a7cd.png 6 57 142 2022-05-06T17:22:14Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png 6 58 143 2022-05-06T17:22:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Blocking Out A Map 0 8 144 44 2022-05-06T17:23:08Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 2a683c73be60e8a7c58cd2c8afe694d0b8970635 148 144 2022-05-06T17:26:04Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 37c56bf32fcb9b0ab45e2bd7fdb3f38decb2820d 150 148 2022-05-06T17:28:10Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. <b>Level Context Volumes</b> Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 6ea4c81d03ea604b99706e60c5ab2450c3c493f7 File:4771381d-97c8-45af-b6e2-4c665c0e6d53.png 6 59 145 2022-05-06T17:23:42Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:5bb1130e-bfd0-487a-83b4-728d59a93170.png 6 60 146 2022-05-06T17:25:11Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:B85c33e2-75e1-4655-8670-86f98db1e7fe.png 6 61 147 2022-05-06T17:25:52Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:4aab6147-a80a-42aa-8189-c8532b507619.png 6 62 149 2022-05-06T17:27:18Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png 6 63 151 2022-05-06T17:29:22Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:E80ae3a6-7b3a-4962-80b3-b112b53500ca.png 6 64 152 2022-05-06T17:30:35Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:D385abfa-c2cb-423d-855d-0ecd160872e5.png 6 65 153 2022-05-06T17:31:21Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Afe565ca-1aac-4527-880b-1b6902d1d820.png 6 66 154 2022-05-06T17:31:57Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png 6 67 155 2022-05-06T17:32:56Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Blocking Out A Map 0 8 156 150 2022-05-06T17:33:12Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 94a07ac655682a92ef640b5b02f3e95f8058d9e7 157 156 2022-05-06T17:34:12Z Chet 3 /* Level Context Volumes */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. e7d2391b-817e-44de-9139-f627d575c3f4.png #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: The following flags are set: I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. <b>Nav Modifier Volumes</b> Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. <b>Feeder Rooms / Room Prefabs</b> A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' c693efafc3f35becc8217dd94804b5454a057601 167 157 2022-05-06T17:42:30Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.pngg]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 607ebe2c961642894487892140cd94cd6f583788 168 167 2022-05-06T17:43:02Z Chet 3 /* Debugging the Context */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' 66cbf2af4832b630c4e70121904faa02ad5b4d0c 170 168 2022-05-06T17:46:10Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Blockout.png]] |} This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png]] |} Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png]] |} If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png]] |} Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 508bc8915dd789ce58a0062c234f06f26db2a6ec File:E7d2391b-817e-44de-9139-f627d575c3f4.png 6 68 158 2022-05-06T17:34:23Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:3206ff65-1abe-44f9-a78b-faf48e35476b.png 6 69 159 2022-05-06T17:35:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:F2734ba5-f7d4-4973-b108-be55d3ce6ee6.png 6 70 160 2022-05-06T17:35:39Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:C1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png 6 71 161 2022-05-06T17:36:14Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:4e79730a-fc19-4ee7-9bbd-915037e8634f.png 6 72 162 2022-05-06T17:36:59Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png 6 73 163 2022-05-06T17:37:40Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png 6 74 164 2022-05-06T17:38:38Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Eac4a6e7-1585-4303-a5d9-88356091d00c.png 6 75 165 2022-05-06T17:39:05Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:9ecfed34-25f0-4727-81d3-5d6f75bba073.png 6 76 166 2022-05-06T17:41:32Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A15a6ac2-e92c-4062-9a28-11b5d947c7ea.png 6 77 169 2022-05-06T17:43:50Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:D7375577-00b8-4fa1-8e90-f4cf8da841fc.png 6 78 171 2022-05-06T17:46:44Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:918f85a8-c620-4672-bd33-9e0d4547d40c.png 6 79 172 2022-05-06T17:46:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Main Page 0 1 173 116 2022-05-06T18:48:03Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] [[Holdout Quickstart Guide]] 6d016b02598af945f1ed30998db81dd0d2ef512a File:B3db59cf-6845-44ae-87a1-41ec1b88ed11.png 6 80 174 2022-05-07T04:01:43Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:C5e1263f-418e-4412-ac8b-5e28e19129cf.png 6 81 175 2022-05-07T04:02:34Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png 6 82 176 2022-05-07T04:03:16Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png 6 83 177 2022-05-07T04:04:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:075854ef-73aa-4189-bfce-9532477d78f2.png 6 84 178 2022-05-07T04:05:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A67aff7f-6662-415b-99a3-f316ea2cae03.png 6 85 179 2022-05-07T04:05:54Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png 6 86 180 2022-05-07T04:07:07Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Holdouts & Activation Systems 0 87 181 2022-05-07T04:07:51Z Chet 3 Created page with "In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckl..." wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} 88a9c18b094d38db27a38f6a7edcb7ef437b03ee 182 181 2022-05-07T04:09:11Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} 126af5428a77f12c331d889582c469a5eb29aea7 184 182 2022-05-07T04:10:36Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. #Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} #These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. 8edb3c04e3bf27490f195d9454c275543282309f 189 184 2022-05-07T04:14:11Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] 7f0cc807b23dbf8e669002f001ee1815b7788c24 191 189 2022-05-07T04:15:58Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] bb5009034d2ca9a4ef661ed4e4931805b11caeab 197 191 2022-05-07T04:22:20Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] d96076e990670f2c168bb679f79206d3ec579422 198 197 2022-05-07T04:22:59Z Chet 3 wikitext text/x-wiki In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Starting== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png]] |} Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] |} On the signal driver actor set the event to Pause: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] |} Here I’ve started a blockout for a holdout that meets the above suggestions: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. |- | [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] cdbb3b96ce4269ff0f5d14df12e7cc690342db48 199 198 2022-05-07T05:17:56Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. |- | [[file:075854ef-73aa-4189-bfce-9532477d78f2.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Sight lines blocked so survivors cannot see other survivors defending on the opposite side. |- | [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] b49545b6829570af6dbb29e37d35787778172a42 200 199 2022-05-07T05:19:43Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. |- | [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png]] |} Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] |} These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] |} Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] |} This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] |} Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] 9f52c09fb3b82ec1b46aae73c8befb6758a70312 File:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png 6 88 183 2022-05-07T04:10:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png 6 89 185 2022-05-07T04:11:30Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Eded1918-4e03-4362-b8dc-839018a43922.png 6 90 186 2022-05-07T04:12:17Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png 6 91 187 2022-05-07T04:13:07Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png 6 92 188 2022-05-07T04:13:50Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:D16e5d62-f034-4450-9d8f-e792c3948c2c.png 6 93 190 2022-05-07T04:15:22Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:96a09216-c290-44cd-8dd0-a8439b0f8969.png 6 94 192 2022-05-07T04:17:55Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png 6 95 193 2022-05-07T04:19:23Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png 6 96 194 2022-05-07T04:20:09Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png 6 97 195 2022-05-07T04:21:00Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png 6 98 196 2022-05-07T04:21:45Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Holdouts & Activation Systems 0 87 201 200 2022-05-07T05:26:12Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] 54a40c79185c63dc6551779bd399817f0a87a380 202 201 2022-05-07T05:26:54Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png]] Duration is the time in seconds the holdout will last. You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. Spawn Endless Common is used to only spawn common and no specials in endless mode. Countdown to Event Start is extra time added before the event starts. Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] 569074b5b88a32dab5ce67ca318224a1adfc74c7 203 202 2022-05-07T05:29:43Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. Set event to StartEvent Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] abf9474f15bbc4b4a6f814f23298bff475c226dc 205 203 2022-05-07T06:14:13Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] 97c710b21e0b836ae9b62ee56766678e06c412d0 206 205 2022-05-07T06:15:56Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] f49fb3adde9a8b7ac376047c0cc999d43701ebe8 219 206 2022-05-07T06:55:29Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== |none|1000px d44a8b34f9f8bc35f81f63e99d1796582cfbb66e 224 219 2022-05-07T07:02:41Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. |none|1000px 438115d64b137859c9c5d895653771d27ea3d315 225 224 2022-05-07T07:03:29Z Chet 3 /* Spawnable Surface Meshes */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. |none|1000px 402a1b78a33fa23f15f2ee2bdb77bcacdea70ac6 226 225 2022-05-07T07:06:04Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] |none|1000px 8778ba63d1ec1824ae5750042cd24fd095dcdbce 238 226 2022-05-07T07:42:59Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] ad0fcbaf447e1235143958b501d30c3819685616 239 238 2022-05-07T07:43:07Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] e2a0bdad56b0dfa1207a3219fae7e91d6c6f5a2b 244 239 2022-05-07T07:57:25Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] dc21b1a8c088e92be87ad309d24cfbc74e5330aa 247 244 2022-05-07T07:59:53Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] 3898fa7279fa368c0af7b108fc335091e8cde3c9 File:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png 6 99 204 2022-05-07T06:12:07Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:63d2dce5-d1dd-4d48-a260-16d879bcee89.png 6 100 207 2022-05-07T06:45:51Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:00241f04-6cd5-4fa4-8304-221126a7b5b4.png 6 101 208 2022-05-07T06:46:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png 6 102 209 2022-05-07T06:47:26Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:2de749a7-6049-4279-a793-0e6790191735.png 6 103 210 2022-05-07T06:47:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:B84e7e0b-6459-49c5-8df2-5c258fc8124a.png 6 104 211 2022-05-07T06:50:16Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png 6 105 212 2022-05-07T06:50:47Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:6079926c-1783-4f58-a3c8-9cf58c0de69e.png 6 106 213 2022-05-07T06:51:41Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Cb1fbdcd-475a-42ad-8521-efeacf08afe2.png 6 107 214 2022-05-07T06:52:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7335aaae-f735-464a-a4dd-4faaedd6b87b.png 6 108 215 2022-05-07T06:52:37Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png 6 109 216 2022-05-07T06:53:09Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:F352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png 6 110 217 2022-05-07T06:54:05Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:960f0ac4-84d2-4508-80ef-a4745722bc18.png 6 111 218 2022-05-07T06:54:33Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png 6 112 220 2022-05-07T06:57:09Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:68b31116-f57a-4366-a844-c165359ef97e.png 6 113 221 2022-05-07T06:58:35Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png 6 114 222 2022-05-07T06:59:33Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png 6 115 223 2022-05-07T07:01:44Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:F2adfae3-7136-46ff-a8e2-c107b98b55fe.png 6 116 227 2022-05-07T07:07:08Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:192616e8-2010-426b-9630-908352cac5b9.png 6 117 228 2022-05-07T07:09:21Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Jump Pads 0 118 229 2022-05-07T07:09:51Z Chet 3 Created page with "This is a simple example for setting up a jump pad. We will use the holdout example map for an example used in the [[Holdouts & Activation Systems]] tutorial. To setup a jump pad you’ll need to start by placing a Blueprint'/Game/Environment/Gameplay/JumpPads/JumpPad' actor.' [[file:f2adfae3-7136-46ff-a8e2-c107b98b55fe.png|none|1000px]] After placing the jump pad you can optionally adjust the size of the Touch Volume Extents. Any player/item/enemy that touches this..." wikitext text/x-wiki This is a simple example for setting up a jump pad. We will use the holdout example map for an example used in the [[Holdouts & Activation Systems]] tutorial. To setup a jump pad you’ll need to start by placing a Blueprint'/Game/Environment/Gameplay/JumpPads/JumpPad' actor.' [[file:f2adfae3-7136-46ff-a8e2-c107b98b55fe.png|none|1000px]] After placing the jump pad you can optionally adjust the size of the Touch Volume Extents. Any player/item/enemy that touches this volume will use the jump pad. Like other volumes you can select the wireframe diamond in 3D view to adjust the volume size. Next modify the spline to match the path of your jump pad. For information on how to work with splines: [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/BlueprintSplines/HowTo/EditSplineComponentInEditor/ How to Edit a Spline Component in the Viewport] Here’s a modified spline set to match the desired path for users. [[file:192616e8-2010-426b-9630-908352cac5b9.png|none|1000px]] 648542bd7b10ac609bf446f7fe624c920838c3c8 236 229 2022-05-07T07:16:45Z Chet 3 wikitext text/x-wiki ===Jump Pads=== This is a simple example for setting up a jump pad. We will use the holdout example map for an example used in the [[Holdouts & Activation Systems]] tutorial. ==Blueprint== To setup a jump pad you’ll need to start by placing a Blueprint'/Game/Environment/Gameplay/JumpPads/JumpPad' actor.' [[file:f2adfae3-7136-46ff-a8e2-c107b98b55fe.png|none|1000px]] After placing the jump pad you can optionally adjust the size of the Touch Volume Extents. Any player/item/enemy that touches this volume will use the jump pad. Like other volumes you can select the wireframe diamond in 3D view to adjust the volume size. ==Splines== Next modify the spline to match the path of your jump pad. For information on how to work with splines: [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/BlueprintSplines/HowTo/EditSplineComponentInEditor/ How to Edit a Spline Component in the Viewport] Here’s a modified spline set to match the desired path for users. [[file:192616e8-2010-426b-9630-908352cac5b9.png|none|1000px]] ==Jump pad Settings== [[file:cf59c625-a595-4e1b-9fd4-8c1ef5c73bee.png|none|1000px]] #Max velocity defines the top speed an actor can reach while on the jump pad. #Acceleration is the force applied in the direction of the spline. #Pull Toward Spline Force controls how closely the actor sticks to the spline, a low value allows more air control and a high value puts the actor directly on the spline. #You can optionally enable/disable gravity while in use, often disabling works better for long curved splines that travel more horizontal. Paths that go straight up sometimes work better with gravity. Next copy the “Smart Link End Point” value and copy that to “Link Relative End” in the Smart Link Comp. [[file:ba4b119e-e4ba-4e07-bc4d-039746cc347d.png]] This step will be automated soon but this defines a link for AI players and enemies to navigate. You can turn on navigation mesh (P) to see the link. [[file:dee22c56-2fce-4fd8-a9f2-99d506c621dd.png|none|1000px]] [[file:67e5cd1e-fecf-49d7-a11b-94eec5c70257.png|none|1000px]] For this jump pad I’ve placed several blocking volumes around it set to the “BlockOnlyNavLinks” collision preset. This stops navlinks from automatically generating. Last, I’ve placed a LevelContextVolume over the entire jump pad and set “No Item Spawns” to true to prevent items from spawning on the jump pad. [[file:0050714d-b3b9-46c5-8d35-e651a7d5e081.png|none|1000px]] Remember, when placing new context volumes or making any changes to your navmesh, the level context does not automatically update. You’ll need to rebuild the context under sb tools. ==Visual Components== The visual components of this jump pad are located here: *StaticMesh'/Game/Environment/ISO/Meshes/Bridge/ISO_JumpPadLift' (The visual mesh) *ParticleSystem'/Game/VFX/Environment/Props/Elevators/p_jumpPad_01' (Glowing blue upward fx) *SkeletalMesh'/Game/VFX/Environment/Props/Elevators/sm_jumpPad_emitGeo' (This is required for the fx to display properly, must be placed in the same location/rotation/scale.) On the Particle Actor it must be paired with this skeletal mesh using the following settings: [[file:7a676f72-3148-4853-b753-76ef4f657803.png|none|1000px]] b73db83fce3fb2a8d4d92e520d2b950ba8988ef5 237 236 2022-05-07T07:17:14Z Chet 3 wikitext text/x-wiki ===Jump Pads=== This is a simple example for setting up a jump pad. We will use the holdout example map for an example used in the [[Holdouts & Activation Systems]] tutorial. ==Blueprint== To setup a jump pad you’ll need to start by placing a Blueprint'/Game/Environment/Gameplay/JumpPads/JumpPad' actor.' [[file:f2adfae3-7136-46ff-a8e2-c107b98b55fe.png|none|1000px]] After placing the jump pad you can optionally adjust the size of the Touch Volume Extents. Any player/item/enemy that touches this volume will use the jump pad. Like other volumes you can select the wireframe diamond in 3D view to adjust the volume size. ==Splines== Next modify the spline to match the path of your jump pad. For information on how to work with splines: [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/BlueprintSplines/HowTo/EditSplineComponentInEditor/ How to Edit a Spline Component in the Viewport] Here’s a modified spline set to match the desired path for users. [[file:192616e8-2010-426b-9630-908352cac5b9.png|none|1000px]] ==Jump pad Settings== [[file:cf59c625-a595-4e1b-9fd4-8c1ef5c73bee.png|none|1000px]] #Max velocity defines the top speed an actor can reach while on the jump pad. #Acceleration is the force applied in the direction of the spline. #Pull Toward Spline Force controls how closely the actor sticks to the spline, a low value allows more air control and a high value puts the actor directly on the spline. #You can optionally enable/disable gravity while in use, often disabling works better for long curved splines that travel more horizontal. Paths that go straight up sometimes work better with gravity. Next copy the “Smart Link End Point” value and copy that to “Link Relative End” in the Smart Link Comp. [[file:ba4b119e-e4ba-4e07-bc4d-039746cc347d.png]] This step will be automated soon but this defines a link for AI players and enemies to navigate. You can turn on navigation mesh (P) to see the link. [[file:dee22c56-2fce-4fd8-a9f2-99d506c621dd.png|none|1000px]] [[file:67e5cd1e-fecf-49d7-a11b-94eec5c70257.png|none|1000px]] For this jump pad I’ve placed several blocking volumes around it set to the “BlockOnlyNavLinks” collision preset. This stops navlinks from automatically generating. Last, I’ve placed a LevelContextVolume over the entire jump pad and set “No Item Spawns” to true to prevent items from spawning on the jump pad. [[file:0050714d-b3b9-46c5-8d35-e651a7d5e081.png|none|1000px]] Remember, when placing new context volumes or making any changes to your navmesh, the level context does not automatically update. You’ll need to rebuild the context under sb tools. ==Visual Components== The visual components of this jump pad are located here: *StaticMesh'/Game/Environment/ISO/Meshes/Bridge/ISO_JumpPadLift' (The visual mesh) *ParticleSystem'/Game/VFX/Environment/Props/Elevators/p_jumpPad_01' (Glowing blue upward fx) *SkeletalMesh'/Game/VFX/Environment/Props/Elevators/sm_jumpPad_emitGeo' (This is required for the fx to display properly, must be placed in the same location/rotation/scale.) On the Particle Actor it must be paired with this skeletal mesh using the following settings: [[file:7a676f72-3148-4853-b753-76ef4f657803.png|none|1000px]] 7295f688caf7cc8e1e28da5cc34689b1d0925c7a File:Cf59c625-a595-4e1b-9fd4-8c1ef5c73bee.png 6 119 230 2022-05-07T07:10:43Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ba4b119e-e4ba-4e07-bc4d-039746cc347d.png 6 120 231 2022-05-07T07:13:12Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Dee22c56-2fce-4fd8-a9f2-99d506c621dd.png 6 121 232 2022-05-07T07:13:47Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:67e5cd1e-fecf-49d7-a11b-94eec5c70257.png 6 122 233 2022-05-07T07:14:02Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:0050714d-b3b9-46c5-8d35-e651a7d5e081.png 6 123 234 2022-05-07T07:14:55Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7a676f72-3148-4853-b753-76ef4f657803.png 6 124 235 2022-05-07T07:16:20Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Eebb2e44-4e1c-4687-8b24-77cc7953042a.png 6 125 240 2022-05-07T07:53:41Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fdf967b4-de01-467c-b8eb-f2292f0a353c.png 6 126 241 2022-05-07T07:54:43Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Progress Meters 0 127 242 2022-05-07T07:55:03Z Chet 3 Created page with "===Progress Meters=== Holdouts often have some visual indicator of how much progress has been made and how much remain. There’s multiple ways you could do this but one simple way is to use the progress meter located under: Blueprint'/Game/Environment/Gameplay/Utils/SimpleMeter' [[file:eebb2e44-4e1c-4687-8b24-77cc7953042a.png|none|1000px]] To configure this actor simply set “Total Time to Fill” to match the length of your event. Optionally set “Do Strobe” to..." wikitext text/x-wiki ===Progress Meters=== Holdouts often have some visual indicator of how much progress has been made and how much remain. There’s multiple ways you could do this but one simple way is to use the progress meter located under: Blueprint'/Game/Environment/Gameplay/Utils/SimpleMeter' [[file:eebb2e44-4e1c-4687-8b24-77cc7953042a.png|none|1000px]] To configure this actor simply set “Total Time to Fill” to match the length of your event. Optionally set “Do Strobe” to make the meter strobe when filling, this can help make it more noticeable. To start the meter simply activate it from the holdout panel: [[file:fdf967b4-de01-467c-b8eb-f2292f0a353c.png] c66143533eddb47ab84a99788e37c10b4e51847b 243 242 2022-05-07T07:55:23Z Chet 3 wikitext text/x-wiki ===Progress Meters=== Holdouts often have some visual indicator of how much progress has been made and how much remain. There’s multiple ways you could do this but one simple way is to use the progress meter located under: Blueprint'/Game/Environment/Gameplay/Utils/SimpleMeter' [[file:eebb2e44-4e1c-4687-8b24-77cc7953042a.png|none|1000px]] To configure this actor simply set “Total Time to Fill” to match the length of your event. Optionally set “Do Strobe” to make the meter strobe when filling, this can help make it more noticeable. To start the meter simply activate it from the holdout panel: [[file:fdf967b4-de01-467c-b8eb-f2292f0a353c.png]] 67ec4a3884fffda789ec5e981e8b08bb5aaa0435 File:B376d0d1-f329-4e75-9d15-44b3b01810d6.png 6 128 245 2022-05-07T07:58:15Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Conveyor/Fans 0 129 246 2022-05-07T07:58:55Z Chet 3 Created page with "There are actors that can rotate, but can also started disabled and start rotating once enabled located under /Game/Environment/Gameplay/Fans/. This can rotate any mesh and players can stand on these creating rotating platforms. Here I’ve placed Blueprint'/Game/Environment/Gameplay/Fans/Fan_Depot_Belt_Large_Narrow' I’ve set Enabled to false and setup the panel to activate this actor when the event starts. [[file:b376d0d1-f329-4e75-9d15-44b3b01810d6.png|none|1000px]]" wikitext text/x-wiki There are actors that can rotate, but can also started disabled and start rotating once enabled located under /Game/Environment/Gameplay/Fans/. This can rotate any mesh and players can stand on these creating rotating platforms. Here I’ve placed Blueprint'/Game/Environment/Gameplay/Fans/Fan_Depot_Belt_Large_Narrow' I’ve set Enabled to false and setup the panel to activate this actor when the event starts. [[file:b376d0d1-f329-4e75-9d15-44b3b01810d6.png|none|1000px]] 1cd371603fb28f13b97d06a07dab0e57d88b46e1 File:9d65754a-7cc7-4cc3-b68d-46b141651834.png 6 130 248 2022-05-07T08:00:37Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:3de182bf-3d07-4637-8661-dd97646462ed.png 6 131 249 2022-05-07T08:01:20Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fee4a9fa-ba1c-4de7-af10-a8f14816bc1a.png 6 132 250 2022-05-07T08:02:08Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:2a52284e-71e9-4c57-bcf6-6f33491be70a.png 6 133 251 2022-05-07T08:02:34Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Event Music 0 134 252 2022-05-07T08:02:54Z Chet 3 Created page with "For event music place a Blueprint'/Game/Environment/Gameplay/Sound/SoundEmitter' actor. Set the Music Layer to “special event”. This helps how music is balanced versus other sounds & music. Most of the music tracks are located under Game/WwiseAudio/Events/Music_Level/. Some of the music is designed to end after a fixed amount of time. Most of the episode 1 music for example is crafted to match the length of the event. However, we created looping tracks that can end..." wikitext text/x-wiki For event music place a Blueprint'/Game/Environment/Gameplay/Sound/SoundEmitter' actor. Set the Music Layer to “special event”. This helps how music is balanced versus other sounds & music. Most of the music tracks are located under Game/WwiseAudio/Events/Music_Level/. Some of the music is designed to end after a fixed amount of time. Most of the episode 1 music for example is crafted to match the length of the event. However, we created looping tracks that can end as needed starting in episode 2 & 3. Here I’ve set Game/WwiseAudio/Events/Music_Level/music_e2l1/Play_e2l1_event_music_segment to the AK Audio Event property: [[file:9d65754a-7cc7-4cc3-b68d-46b141651834.png]] I’ve set “Synchronized Networked Music” to true. This allows players joining the game late to start the music at the same point. Add this actor to the list of actors to be activated by the panel. Next place another SoundEmitter. This one will be used to end the event music. Use the following settings: [[[file:3de182bf-3d07-4637-8661-dd97646462ed.png]] There are multiple places you could activate this actor from at the end of the holdout. *On the SpecialEvent actor, under Special Event Cues you could use “Event End” [[file:fee4a9fa-ba1c-4de7-af10-a8f14816bc1a.png]] *Another good spot is on the SimpleMeter actor, there’s a OnFinished list you could use to activate actors: [[file:2a52284e-71e9-4c57-bcf6-6f33491be70a.png]] bdfdf7b3748d6017117fa4c55477c13a06c338ed Holdouts & Activation Systems 0 87 253 247 2022-05-07T08:03:22Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] f0825d09c2218f08cfb19051ecccbc106b9546f7 259 253 2022-05-07T08:06:13Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] [[Toggleable Lights]] 89fca4e7588ec2a8e35a515b8f60778fc1f6b42f 262 259 2022-05-07T08:07:47Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] [[Toggleable Lights]] [[EmitterToggleable]] c21b082b3545ede3ef6477af322aecd9853a6de3 264 262 2022-05-07T08:08:27Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] [[Toggleable Lights]] [[EmitterToggleable]] [[Doors]] 296e52aca6c2ae1594753f6028706590f948fa0e 271 264 2022-05-07T08:14:32Z Chet 3 /* Adding Flourish */ wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] [[Toggleable Lights]] [[EmitterToggleable]] [[Doors]] [[Combat Tuning]] e6cc4d65d15928cd7ca3e5a0d2435856186293e2 275 271 2022-05-07T08:17:55Z Chet 3 wikitext text/x-wiki ===Setting up Holdout Events=== In this tutorial we are going to create a holdout style special event. These are timed scenarios where the players must survive hordes of enemies. These are the one exception where the director isn’t deciding when to spawn enemy hordes. However, there is still randomization & control of spawning within these events by the director. There are also two other types of special events, Run’n’Gun & Checkpoint, but we’ll go over those later. This is a long one so buckle up! ==Preamble== First a few suggestions to follow when creating and placing your special events in a level: #Holdouts are about players making a plan together and the director's job is to disrupt that plan. Ideally the resulting chaos is where players form lasting memories. Give them multiple options and locations that look like good ways to survive, but no one option should clearly be the right answer. This makes the event more replayable and hopefully prevents it from feeling the same every time. #No Cheese! Try to avoid creating sweet spots where players can camp and watch one direction the entire event. We call this cheesing the event which can make an event boring and not very replayable. To do this we always have areas enemies can spawn to flush out players, so players have to watch their backs. ##We always make entries into these events one way, disallowing players from backtracking. Events can be cheesed if players can simply run away from them. ##Likewise, exits are usually blocked until the event is complete for the same reason. ##Try to think of a creative reason both your entry & exit is blocked. Are they waiting for a lift or power up sequence? Vehicle? Are they waiting to destroy something? Doors work, we use them too, but come up with something unique to make the event more memorable. #Try to find a way to gather the squad before starting the event. In the tutorial we’ll give an example of the panel that requires two players to start and panels that require all players. #You’ll need to include areas only enemies can spawn and enter the holdout. #Play with line of sight. If all the defense points are visible from each other, then survivors can too easily save each other. Blocking line of sight adds more risk to those positions. Also try making better spots more exposed which creates a higher risk to getting caught by specials. #Be mindful of the distance from your main enemy spawn areas to the typical player defense positions. You don’t want those enemy paths to be too long or too short. #Try to place landmarks or iconic elements near the enemy entry points, this helps players communicate where an oncoming wave is coming from. ==Setting the Scene== First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:b3db59cf-6845-44ae-87a1-41ec1b88ed11.png|none|1000px]] Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver') and have the volume activate it: Note: Use once is set to true. First we want to setup the driver to pause shortly before the holdout. This prevents the driver from automatically kicking off dynamics events just before the holdout. Create a volume (Blueprint'/Game/Environment/Gameplay/Volumes/Volume') across your main path: [[file:c5e1263f-418e-4412-ac8b-5e28e19129cf.png]] On the signal driver actor set the event to Pause: [[file:1d4ab8f9-43f7-49b2-af56-b371f47d142a.png]] ==Example Blockout== Here I’ve started a blockout for a holdout that meets the above suggestions: One way drop down in the foreground to prevent backtracking. Exit blocked until holdout is complete. [[file:97c516f9-38f6-4bdc-9694-1ef30fe106ad.png|none|1000px]] The fortified central position has reduced sight lines and a well in the middle that enemies can spawn from to flush out survivors. The outer ring has better sight lines but broken railing make it easier to get grabbed by specials. [[file:075854ef-73aa-4189-bfce-9532477d78f2.png|none|1000px]] Sight lines blocked so survivors cannot see other survivors defending on the opposite side. [[file:a67aff7f-6662-415b-99a3-f316ea2cae03.png|none|1000px]] Enemy spawn points have food holograms to help players communicate the direction of an oncoming wave. [[file:5678c8bb-ae96-4eeb-b6e3-f37b60e08eb2.png|none|1000px]] ==Creating the trigger== Now, for setting up the special event! First let’s place a panel that will activate the event. The first example is a panel that requires all players nearby to use. Place Blueprint'/Game/Environment/Gameplay/Panels/Panel_RequireAllPlayers'. Typically these buttons are about 100 units off the floor. [[file:831e3c9b-0017-4a76-a18a-1c5641c2f0f6.png|none|1000px]] These type of buttons show the in game text hint, “Requires All Players” and start disabled. They’re only usable once by default. Next we’re going to setup a volume to enable the button when all players are nearby and disable it if anyone leaves. Place a Blueprint'/Game/Environment/Gameplay/Volumes/Volume' near the panel. Resize this volume to an area large enough for all players. To easily resize select the Volume Extents diamond in 3D view. This allows you to use a move widget to resize the volume. [[file:08fe78a2-5500-4bf5-905a-b36f83aa0e6f.png]] Rename this actor to “Volume_RequireAllPlayers”. This step isn’t required but helps for organization. Now setup the volume to activate the panel on enter and on leave and set the flag “Require All Players to Activate” to true: [[file:eded1918-4e03-4362-b8dc-839018a43922.png]] This volume will enable and disable the panel when activated. Require All Players means the volume will activate the On Enter list when all players are in the volume. Once any player leaves the volume the On Leave list activates. We need a way to disable this volume once the button is pressed. To do this we will destroy the volume. Create a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_DestroyTarget' actor. Add Volume_RequireAllPlayers” to the Destroy Actors List: [[file:023ba0a8-5126-42d2-8dbb-485d24da0ff3.png]] Now let’s return to the panel and have it activate the Trigger_DestroyTarget actor immediately on use under the Activations category: [[file:1808c031-3f07-46b2-917e-4ccdd4bfb8f6.png]] Activation List will activate actors in its list after the Activation Delay. Activation List Immediate ignores this delay and activates everything in its list the moment the panel is used. You’ve just used our Activation system. Almost all actors under the Environment/Gameplay directory is setup to use this system allowing all sorts of actors to interact with each other via this system. Doors, Elevators, Emitters, JumpPads, etc. And many of those have their own way to activate other actors based on their actions. To check if an actor is setup to use this system open the blueprint then go to the class settings tab. If the “Activation Interface” is listed under implemented or inherited interfaces then it can be activated, usually this means toggling off and on but it depends on each actor: (In the future we plan to document all these actors on a wiki for modders to learn and use.) [[file:d16e5d62-f034-4450-9d8f-e792c3948c2c.png|none|1000px]] ==Setting up the Special Event in the Director== Next, we need to setup the Special Event, start by placing Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecialEventDriverBP' #Start by setting an EventName, this can be any unique name and will be used later for setting up enemy spawn locations. #Event type should be set to Holdout, we currently also support Run N Gun and Checkpoint which will be described in another tutorial. #Difficulty is Chill - Easy, Not Boring - Normal (typically used), and Hoo Boy - Hard (rarely used) #You can define a custom intensity curve that goes from 0 to 1 over the specified duration. ##Checkpoints events & Run N Gun can have run over 1 but you can ignore that for this tutorial. ##Custom intensity curved defined going from 0 to 1 on X axis for time and values from about 0.75 to 2.5 on the y-axis defining the intensity. #Duration is the time in seconds the holdout will last. #You can ignore Checkpoint Wave Count since that’s for the checkpoint type of events. (Note: Most properties in our game have tooltips that can be seen by hovering your mouse over the property name.) #Endless mode are for special events where you need the event to keep running on auto pilot after the defined duration. This is often used where players need to wait for an event then need to rush to something or escape. #Spawn Endless Common is used to only spawn common and no specials in endless mode. #Countdown to Event Start is extra time added before the event starts. #Percent Threat from Waves defines how much of the intensity of the event comes from groups of specials & common versus a trickle of spawning common. If set to 1.0 there will be no trickle and only groups coming in waves. #Special Event Cues can be used to activate anything when events & waves start and end. This is primarily used to activate sounds & music but could be used on anything that uses the activation system. [[file:a2f8ed4f-66fb-4b1d-9269-e2834842a5a5.png|none|1000px]] This is an example of an intensity curve. [[file:96a09216-c290-44cd-8dd0-a8439b0f8969.png|none|1000px]] ==Starting the Event== Next place a SignalDriver actor (Blueprint'/Game/Environment/Gameplay/Level/SignalDriver'). This will be used to start the above defined event. #Set event to StartEvent #Point Special Event Driver to the SpecialEventDriverBP actor you placed & defined above. [[file:cf96a2a3-f15e-46ab-97e1-4abf7a5d9827.png]] Add the SignalDriver to the activation list on the panel: [[file:7461ab15-81b7-4514-8e28-0aaad3d8fa93.png]] Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] Set the Event Name on the spawner to the same name you set on the SpecialEventDriverBP actor. [[file:2fb2211b-9c4c-459e-a5be-3078a28b4c92.png]] This connects the spawn locations with this event and allows for maps with multiple events. Once you’ve created one its easier to copy and place those around in your spawn areas. Make sure you recompile nav & context. You’ll need both valid nav mesh & a context mesh where these spawn locations are located in order to work. ==Time To Test== Some helpful commands to debug your event: NukeAllAliens will kill all enemies in the world. Useful to run before starting an event if you’re jumping ahead in the editor. sb.actors.locate 1 turns on a debug view to show you all enemy & pickup spawns through walls. Set to 0 to turn off. sb.ai.hub 1 turns on an AI & director debug view. You can press Z to make the view more less opaque. In the top right corner is information on the state of the director or AI driver. The state will change from airlock/pause/rest/idle to “special event” when the event is activated. For a complete list of console commands go here: [[Developer Cheats and Debug CVars]] ==Context and Holdouts== In the previous tutorial we learned about level context volumes and marking up areas where players cannot travel. It’s especially important in special events to mark areas as unshootable if players cannot reach them otherwise the Spawner special, for example, may never reveal itself from hidden areas. With special events you may find you need to mark areas as unshootable but only once the event starts. For example, in this map the area you drop down from needs to be marked unshootable once the event starts but is a normal map area before the event. To do this place a LevelContextVolume but set “Runtime Volume Enabled by Default” to false: [[file:00241f04-6cd5-4fa4-8304-221126a7b5b4.png]] I renamed these level context volumes to LevelContextVolumeToggle but only to help for organization. It’s easy to mix these up with the LevelContextVolume actors that you don’t intend to toggle on. Next place a Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_ToggleLCV' near your panel. Add the level context volumes to the “Level Context Volumes” list that need to be toggled on: [[file:63d2dce5-d1dd-4d48-a260-16d879bcee89.png]] Add the ToggleLCV actor to the list of activated actors on the panel: [[file:c50b3687-0df9-406f-a9fb-36709bef3159.png]] Don’t forget to rebuild your context after adding new LevelContextVolumes! ==Two Player Activation (optional)== The above setup is for an example a panel that requires all players, but here’s a quick example how to setup sync panels that require two players to press them at the same time. Start by placing two Panel_Airlock actors that are far enough apart a single player couldn’t quickly press both panels. [[file:54beb9df-14dc-4e0e-a818-78dd7e07eccb.png|none|1000px]] Select both then set Use Once to true and set “Manual Linked Panel for Coop” to true. Select one of the panels then assign the other panel to the “Linked Panel” property: [[file:2de749a7-6049-4279-a793-0e6790191735.png]] This will automatically assign the Linked Panel property on the other Panel actor. Unlike the Panel we setup earlier, where we had actors directly activated from the Panel, it is recommended we setup a Trigger actor that does the activations as a relay. This way if we ever have to update the activation list we only have to update one Trigger actor rather than both Panels. *Place two Blueprint'/Game/Environment/Gameplay/Triggers/Trigger' actors in between the two buttons. *I renamed one to Trigger_SyncActivationList and another Trigger_SyncActivationListImmediate to help with organization. *With both Panels selected assign these two new triggers: [[file:b84e7e0b-6459-49c5-8df2-5c258fc8124a.png]] *On the Trigger actors I’ve copied the activation lists from our earlier Panel example: [[file:322c32f9-493a-4cf7-aa4d-f3154ade9a5b.png]] These are almost ready to use! If you were playing with other human players these would be good to go, but player bots will not know to use these unless we setup the AICoordinatorInfo actor. This actor helps inform player bots about the world, such as pressing panels or opening doors. You can even have the entire team go AFK and watch player bots play through your level if setup properly. *Start by placing Blueprint'/Game/Environment/Gameplay/Level/AICoordinatorInfoBP' near your level start. *Add an element between [0] and [1] by selecting the small drop down by the Airlock End event and selecting insert: [[file:6079926c-1783-4f58-a3c8-9cf58c0de69e.png]] [[file:cb1fbdcd-475a-42ad-8521-efeacf08afe2.png]] *Set this new element to “Press Button” or “Open Door” depending on if you have a door that also needs to be opened by these panels. For this example we’ll use Open Door. *Select one of your linked panels then select the GameplayTags component: [[file:7335aaae-f735-464a-a4dd-4faaedd6b87b.png]] *Add ActorType.World.Panel.LinkedPanels to the Gameplay Tag Container: [[file:26c4171d-2d53-4ab2-870a-6f08e1f4cc1b.png]] *Repeat this step on the other Panel. *If you have a door that will be opened by these panels, even if its delayed until after the event, select that door and we’ll add a unique tag to its GameplayTags component as well. If you used the “Press Button” event type on the coordinator you can skip this step. Add ActorType.World.Door.LinkedPanel to your door. [[file:f352c2eb-e1bf-4f2c-b3b5-7019dab20d0f.png]] *Now select your AICoordinator actor and add these tags to your event: [[file:960f0ac4-84d2-4508-80ef-a4745722bc18.png]] *Now your player bots should know how to press your linked panels to help you start the event. ==Pickups== For some events we pre-place ammo, matter compilers, and randomize some weapon, special weapon, and grenade pickups. Pickup items are located in Environment/Gameplay/Pickups. These are non-randomized pickups, they’ll always spawn the item placed. Place a Blueprint'/Game/Environment/Gameplay/Pickups/AllAmmoPickupSolid' somewhere in our event area. This is an ammo charging station. (This one is placed away from the main defense positions requiring players to risk running down for a recharge.) [[file:40accd1a-b7c3-49ff-9bae-5a110c4f839d.png|none|1000px]] For finales events at the end of an episode we recommend placing Blueprint'/Game/Environment/Gameplay/Pickups/LootBoxes/LootBox_Final' to place a matter compiler. Typically for small items we use randomized pickups called SpawnableSurfaces: Blueprint'/Game/Environment/Gameplay/SpawnableSurfaceObjects/SpawnableSurface_1x1a' or 1x2 or 1x3 variants. *Spawnable surfaces are locations the driver can randomly spawn pickups. By default this is completely random and may not not spawn anything at all. We have hundreds of these spots defined throughout our levels on objects such as chairs or chairs. *To guarantee items spawns you can add Cache Items: [[68b31116-f57a-4366-a844-c165359ef97e.png|none|1000px]] *Grenade will randomly choose between any of the grenade types for example. Interactable Obj can randomly spawn either explosive tanks or placeable turrets. *You can add one cache item for every “Pickup Spawn Point”. Pickup Spawn Points are visible as wireframe diamonds in the 3D Viewport: [[file:70bda151-2c84-4ce8-a6b7-02c1889fd8dd.png]] *You can select these diamonds and move the spawn location, or add more spawn points and move those. *Percent Chance to Activate can be used to randomize if items will spawn or not. -1 is the default which guarantees cache item(s) will spawn. This property can be ignored if not a cache. *I’ve placed several of these around the holdout area, some near the defensive position and some out in areas that may be risky to go during the holdout. ==Spawnable Surface Meshes== If you’ve browsed are various staticmesh objects under ISO/Meshes you may notice blueprint versions of some meshes with the postfix _SS. For example: StaticMesh'/Game/Environment/ISO/Meshes/ISO_Mall_Table' (This is a standard staticmesh table.) Blueprint'/Game/Environment/ISO/Meshes/ISO_Mall_Table_SS' (This is a version of that same table with a spawnable surface configured.) [[file:29cbc3d7-d66c-4617-9b7c-de94b13e5b8f.png|none|1000px]] Whenever possible you should use the spawnable surface version so that the driver may randomly place items. For tables or chairs that are knocked over, for example, it is recommended to use a standard staticmesh. ==Adding Flourish== If you check our the example you can see we have added many additional elements to add some flourish to the map. These are listed below. [[Jump Pads]] [[Progress Meters]] [[Conveyor/Fans]] [[Event Music]] [[General Music]] [[Toggleable Lights]] [[EmitterToggleable]] [[Doors]] ==Combat Tuning== This is our last step, nearly there! Currently our holdout space is a bit boring in that there’s really nothing between our spawn points and the central platform. [[file:1c6ab2aa-908b-4de3-8468-e007baefab3b.png|none|1000px]] To make combat more interesting typically we place some low or standing height obstacles in spaces. This way enemies have to run around or over these obstacles. This makes them take a visually more interesting path as opposed to running straight toward you, and this also makes them a more interesting target to shoot at. With this space I’m running with the idea that its a dining area with the food dispensary in the middle. So I’ve placed tables, chairs, and fallen debris in various spots in the lower area. [[file:359a38ae-7a30-4fe7-9190-65ef9e93834f.png|none|1000px]] Last step, as always, whenever navmesh is updated or adding level context volumes you will need to rebuild navlinks and the context. [[file:097b84f5-e930-47b4-8c6a-919b60361af6.png]] You’re done! The next best step is to playtest with other real players and keep iterating. Playing with other real players will reveal new bugs and ideas. Rinse and repeat this step at the blockout stage until you’re satisfied with your map & holdouts. This example map is located under: World'/Game/Maps/Tutorials/03_Special_Event_Holdout' c8e3cdcf7de9747c08bef4b966f48f16cd471263 File:8cd59e39-d082-4ae5-9d99-18655c586df9.png 6 135 254 2022-05-07T08:03:55Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Babdc505-dc57-461a-a98a-5611f56c4139.png 6 136 255 2022-05-07T08:04:35Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:1a1de20a-040b-4a2c-b8a4-c8b503e14f25.png 6 137 256 2022-05-07T08:05:05Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 General Music 0 138 257 2022-05-07T08:05:15Z Chet 3 Created page with "For General Level Music place: Blueprint'/Game/Audio/BP_PlayMusicActor.BP_PlayMusicActor' This is usually placed near the start of a level. Use the following settings: [[file:8cd59e39-d082-4ae5-9d99-18655c586df9.png]] Music layer is set to “level” for general level music. This is not set to Networked Music since its not necessary but this can be set to true if that feels appropriate for you. This music track is designed to turn off shortly before the hold out...." wikitext text/x-wiki For General Level Music place: Blueprint'/Game/Audio/BP_PlayMusicActor.BP_PlayMusicActor' This is usually placed near the start of a level. Use the following settings: [[file:8cd59e39-d082-4ae5-9d99-18655c586df9.png]] Music layer is set to “level” for general level music. This is not set to Networked Music since its not necessary but this can be set to true if that feels appropriate for you. This music track is designed to turn off shortly before the hold out. To do this type MusicVolume in the Place Actors window and place one in the world. [[file:babdc505-dc57-461a-a98a-5611f56c4139.png]] Place it along a main path where it cannot be skipped with the following settings: [[file:1a1de20a-040b-4a2c-b8a4-c8b503e14f25.png]] f6c02183657e00828d029a992da0926628b0bd5d 258 257 2022-05-07T08:05:30Z Chet 3 wikitext text/x-wiki For General Level Music place: Blueprint'/Game/Audio/BP_PlayMusicActor.BP_PlayMusicActor' This is usually placed near the start of a level. Use the following settings: [[file:8cd59e39-d082-4ae5-9d99-18655c586df9.png]] Music layer is set to “level” for general level music. This is not set to Networked Music since its not necessary but this can be set to true if that feels appropriate for you. This music track is designed to turn off shortly before the hold out. To do this type MusicVolume in the Place Actors window and place one in the world. [[file:babdc505-dc57-461a-a98a-5611f56c4139.png]] Place it along a main path where it cannot be skipped with the following settings: [[file:1a1de20a-040b-4a2c-b8a4-c8b503e14f25.png]] 571c667a81f9253f3b79639e238e9f106cab218c File:Ed3b6dd6-baee-4bb4-9151-64ce50f08253.png 6 139 260 2022-05-07T08:06:49Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Toggleable Lights 0 140 261 2022-05-07T08:07:22Z Chet 3 Created page with "All toggleable lights exist under Game/Environment/Gameplay/Lights/. These work like standard lights except can’t be toggled off and on if in movable or stationary mode. Here I’ve placed Blueprint'/Game/Environment/Gameplay/Lights/SpotLightToggleable' by the exit door and set Enabled to false: [[file:ed3b6dd6-baee-4bb4-9151-64ce50f08253.png|none|1000px]] I also setup this light to be activated from the SimpleMeter." wikitext text/x-wiki All toggleable lights exist under Game/Environment/Gameplay/Lights/. These work like standard lights except can’t be toggled off and on if in movable or stationary mode. Here I’ve placed Blueprint'/Game/Environment/Gameplay/Lights/SpotLightToggleable' by the exit door and set Enabled to false: [[file:ed3b6dd6-baee-4bb4-9151-64ce50f08253.png|none|1000px]] I also setup this light to be activated from the SimpleMeter. 68ca077230dfe43606c0fc4d24ba37fbf834db68 EmitterToggleable 0 141 263 2022-05-07T08:07:56Z Chet 3 Created page with "Particles can be toggled off/on using Blueprint'/Game/Environment/Gameplay/Emitters/EmitterToggleable'" wikitext text/x-wiki Particles can be toggled off/on using Blueprint'/Game/Environment/Gameplay/Emitters/EmitterToggleable' 5e9e1586c149b3bb6f43e36f1bba49b8a55c5d66 File:6aea26be-d2b8-4f09-bd5b-184c5ab2339a.png 6 142 265 2022-05-07T08:10:03Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fe43c317-d02d-4604-8811-553fe9c015b9.png 6 143 266 2022-05-07T08:10:41Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fa3015e5-b2c9-4aa9-8247-7dddc2c6cb44.png 6 144 267 2022-05-07T08:11:14Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:990525e4-c0a6-4f57-934e-426dbea44416.png 6 145 268 2022-05-07T08:11:48Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Doors 0 146 269 2022-05-07T08:13:27Z Chet 3 Created page with "This page uses the [[Holdouts & Activation Systems]] for examples. At the exit of this holdout space I’ve placed a door. Blueprint'/Game/Environment/Gameplay/Doors/Door_Depot_Tram_6x4' Several doors in this directory can be used. Most can be activated to be opened & closed but the Mode property must be set to “Toggle” for this to work. *The alternate mode, “Auto”, are for special doors that automatically open and close when players are nearby. On this Door I..." wikitext text/x-wiki This page uses the [[Holdouts & Activation Systems]] for examples. At the exit of this holdout space I’ve placed a door. Blueprint'/Game/Environment/Gameplay/Doors/Door_Depot_Tram_6x4' Several doors in this directory can be used. Most can be activated to be opened & closed but the Mode property must be set to “Toggle” for this to work. *The alternate mode, “Auto”, are for special doors that automatically open and close when players are nearby. On this Door I’ve set the State Access property to “Locked”. This displays the locked state on the door. You should see lights & materials change from white to red if your door has lights. In order for a locked door to be opened it must first be unlocked. To do this place: Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_SetDoorAccessState' On this actor I’ve set the Door property to my new door: [[file:6aea26be-d2b8-4f09-bd5b-184c5ab2339a.png]] I’ve left the New Door State at Unlocked then activate this actor from the SimpleMeter actor. *Unlocking the door will change its state to unlocked but will not open the door. To open the door place a Trigger Actor, set Use Once to true, set a min/max delay of 2 seconds, and add the door to the activation list. [[file:fe43c317-d02d-4604-8811-553fe9c015b9.png]] Activate this new trigger from the SimpleMeter. [[file:fa3015e5-b2c9-4aa9-8247-7dddc2c6cb44.png]] Doors have lots of options, below are some quick descriptions of the various properties. [[file:990525e4-c0a6-4f57-934e-426dbea44416.png]] #Start Open - Sometimes you want doors to start open. #Start Damaged - Some doors have a damage state configured which flickers lights, sparks, and usually open & close slower. #Interactable - Can this door be opened/closed by pressing use. #State Access - Unlocked doors can be opened. Locked doors cannot be opened until unlocked. Permanently Locked doors can never be opened and look powered off. #Attach To - Option to attach door to another thing, such as an elevator or fan. #Position Open - Where you door will go when it opens. Currently we only support sliding doors. You can modify this property by selecting the diamond wireframe widget in the 3D Viewport: #Collision Profile Name - The collision profile to use once in game. Doors default to InvisibleWall so the level context can see through doors when compiling visibility in the editor. #Speed Close/Open - Speed to move. #Speed Close/Open Damaged - Speed to move if damaged. #Mode - Toggle doors can be opened and closed if activated & unlocked. Auto doors automatically open and close based on Auto Open Distance. Doors in Auto mode cannot be activated to open and close doors. #Auto Mode Close Delay - For doors in “Auto” mode this is the delay before the door will automatically close after players have left its area. #Auto Open Distance - Distance to automatically open if in Auto mode. #Interp Style - “Constant” is for linear movement, looks good on large slow doors. “Smooth” eases the door in and out of its open and closed position. #Interrupt Behavior - NotInterruptible, if a door is activated while in motion it will ignore the activation. PauseResume, if activated while in motion the door will pause. If activated again it will resume the direction it was going. PauseReverse, if activated while in motion the door with pause. If activated again it will reverse direction it was going. Reverse, if activated while in motion the door will instantly reverse direction. #Has Light - Some doors do not have lights built into the visual mesh. This disables the attached pointlight. #Door Light Intensity - For doors with a light this controls the brightness. #Light Material Index - The material id that has an emissive you’d like to automatically update when door is locked/unlocked/permanently locked. The materials to switch to are under MaterialStates. #Open for Specials and Player Bots - If a toggle mode door that is interactable, this allows intelligent AI to open the door, so specials & player bots. Common cannot open doors. #Update Nav After Fully Open - This controls whether the navmesh blocking AI is updated before or after opening. Helpful for big slow doors versus fast doors. #FX - The color to use for the light on the various access states. #Linked External Mesh - These options can be used to update a staticmesh associated with the door. For example this is used to update materials on the airlock door frame. #SFX - Sounds to use. ##Audio Portal - If the door opening and closing should impact sound occlusion. 0ad355071221913fda4a0e9d7ce3c219af695292 270 269 2022-05-07T08:14:00Z Chet 3 wikitext text/x-wiki This page uses the [[Holdouts & Activation Systems]] for examples. At the exit of this holdout space I’ve placed a door. Blueprint'/Game/Environment/Gameplay/Doors/Door_Depot_Tram_6x4' Several doors in this directory can be used. Most can be activated to be opened & closed but the Mode property must be set to “Toggle” for this to work. *The alternate mode, “Auto”, are for special doors that automatically open and close when players are nearby. On this Door I’ve set the State Access property to “Locked”. This displays the locked state on the door. You should see lights & materials change from white to red if your door has lights. In order for a locked door to be opened it must first be unlocked. To do this place: Blueprint'/Game/Environment/Gameplay/Triggers/Trigger_SetDoorAccessState' On this actor I’ve set the Door property to my new door: [[file:6aea26be-d2b8-4f09-bd5b-184c5ab2339a.png]] I’ve left the New Door State at Unlocked then activate this actor from the SimpleMeter actor. *Unlocking the door will change its state to unlocked but will not open the door. To open the door place a Trigger Actor, set Use Once to true, set a min/max delay of 2 seconds, and add the door to the activation list. [[file:fe43c317-d02d-4604-8811-553fe9c015b9.png]] Activate this new trigger from the SimpleMeter. [[file:fa3015e5-b2c9-4aa9-8247-7dddc2c6cb44.png]] Doors have lots of options, below are some quick descriptions of the various properties. [[file:990525e4-c0a6-4f57-934e-426dbea44416.png]] #Start Open - Sometimes you want doors to start open. #Start Damaged - Some doors have a damage state configured which flickers lights, sparks, and usually open & close slower. #Interactable - Can this door be opened/closed by pressing use. #State Access - Unlocked doors can be opened. Locked doors cannot be opened until unlocked. Permanently Locked doors can never be opened and look powered off. #Attach To - Option to attach door to another thing, such as an elevator or fan. #Position Open - Where you door will go when it opens. Currently we only support sliding doors. You can modify this property by selecting the diamond wireframe widget in the 3D Viewport: #Collision Profile Name - The collision profile to use once in game. Doors default to InvisibleWall so the level context can see through doors when compiling visibility in the editor. #Speed Close/Open - Speed to move. #Speed Close/Open Damaged - Speed to move if damaged. #Mode - Toggle doors can be opened and closed if activated & unlocked. Auto doors automatically open and close based on Auto Open Distance. Doors in Auto mode cannot be activated to open and close doors. #Auto Mode Close Delay - For doors in “Auto” mode this is the delay before the door will automatically close after players have left its area. #Auto Open Distance - Distance to automatically open if in Auto mode. #Interp Style - “Constant” is for linear movement, looks good on large slow doors. “Smooth” eases the door in and out of its open and closed position. #Interrupt Behavior - NotInterruptible, if a door is activated while in motion it will ignore the activation. PauseResume, if activated while in motion the door will pause. If activated again it will resume the direction it was going. PauseReverse, if activated while in motion the door with pause. If activated again it will reverse direction it was going. Reverse, if activated while in motion the door will instantly reverse direction. #Has Light - Some doors do not have lights built into the visual mesh. This disables the attached pointlight. #Door Light Intensity - For doors with a light this controls the brightness. #Light Material Index - The material id that has an emissive you’d like to automatically update when door is locked/unlocked/permanently locked. The materials to switch to are under MaterialStates. #Open for Specials and Player Bots - If a toggle mode door that is interactable, this allows intelligent AI to open the door, so specials & player bots. Common cannot open doors. #Update Nav After Fully Open - This controls whether the navmesh blocking AI is updated before or after opening. Helpful for big slow doors versus fast doors. #FX - The color to use for the light on the various access states. #Linked External Mesh - These options can be used to update a staticmesh associated with the door. For example this is used to update materials on the airlock door frame. #SFX - Sounds to use. ##Audio Portal - If the door opening and closing should impact sound occlusion. 2884d06187bbe7d54df357fb068652ec0c52b896 File:1c6ab2aa-908b-4de3-8468-e007baefab3b.png 6 147 272 2022-05-07T08:16:04Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:359a38ae-7a30-4fe7-9190-65ef9e93834f.png 6 148 273 2022-05-07T08:16:53Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:097b84f5-e930-47b4-8c6a-919b60361af6.png 6 149 274 2022-05-07T08:17:35Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Developer Cheats and Debug CVars 0 150 276 2022-05-07T08:42:01Z Chet 3 Created page with "{| class="wikitable" !colspan="3"|Cheats |- |Command |Parameters |Info |}" wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |Command |Parameters |Info |} 1ae293efcb9c63ac1e8a5ac1a59ec637f6f8ff53 277 276 2022-05-07T08:42:42Z Chet 3 wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |Command |Parameters |Info |- |sb.cheat.ammo |0/1 |If 1, all weapons have unlimited ammo (not health packs) |} aaa72f3ab16b33adcb8f221c5ba0417ec976bead 278 277 2022-05-07T08:44:31Z Chet 3 wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |<b>Command</b> |Parameters |Info |- |sb.cheat.ammo |0/1 |If 1, all weapons have unlimited ammo (not health packs) |} 7ee67cbecdd2c12c87f13d7f4672cbdcf8f127a6 279 278 2022-05-07T08:50:20Z Chet 3 wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |<b>Command</b> |<b>Parameters</b> |<b>Info</b> |- |sb.cheat.ammo |0/1 |If 1, all weapons have unlimited ammo (not health packs) |- |sb.cheat.fillammo |0/1 |If set players start with full ammo |- |sb.cheat.god |0/1 |If 1, the player will not take damage, or be subject to movement penalties from enemy hit reactions. ONLY WORKS ON SERVER/AUTHORITY. |- |FillAmmo |[none] |Gives the current player max ammo of every type |- |GetDown |[none] |Downs your survivor immediately |- |GetUp |[none] |Revives your survivor if downed |- |Die |[none] |Kills your survivor |- |Respawn |[none] |Respawns your survivor |- |RespawnSurvivors (Host only) |[none] |Respawns all survivors |- |FixSurvivorType |[none] |Replaces your grey survivor with a normal one |- |WinGame (Host only) |[none] |Immediately wins the current level |- |LoseGame (Host only) |[none] |Immediately lose the current level |- |SpawnObject |(see in game help) |Spawns the specified object in the world where you are currently looking. |- |name |new name |sets the local player’s name to the value provided |- |DisablePlayerBots |[none] |Disables the player bots |- |EnablePlayerBots |[none] |Enables the player bots |- |AddPassiveInventoryItem |PerkBlueprintName |Gives you a perk !colspan="3"|DEBUGGING - AI ENEMIES & BOTS |- |sb.ai.hub |0/1 |If not zero, the AI Debug HUB will be enabled! Allows to spawn AI and peek into the state of the AI Driver. |- |sb.ai.debugdraw |0/1 |If not zero, AI will draw debug stuff regarding their positions and mantling algorithms. |- |sb.ai.debugdrawnav |0/1 |If not zero, Bots will draw debug navigation information. |- |sb.ai.disableperception |0/1 |If not zero, Bots will not perceive any targets. Useful for checking out their unaware behavior or otherwise not getting attacked. Does not clear any targets that are already found. |} 0d605c6ff605dc9a789a976745ad303ae111a3da 280 279 2022-05-07T08:50:39Z Chet 3 wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |<b>Command</b> |<b>Parameters</b> |<b>Info</b> |- |sb.cheat.ammo |0/1 |If 1, all weapons have unlimited ammo (not health packs) |- |sb.cheat.fillammo |0/1 |If set players start with full ammo |- |sb.cheat.god |0/1 |If 1, the player will not take damage, or be subject to movement penalties from enemy hit reactions. ONLY WORKS ON SERVER/AUTHORITY. |- |FillAmmo |[none] |Gives the current player max ammo of every type |- |GetDown |[none] |Downs your survivor immediately |- |GetUp |[none] |Revives your survivor if downed |- |Die |[none] |Kills your survivor |- |Respawn |[none] |Respawns your survivor |- |RespawnSurvivors (Host only) |[none] |Respawns all survivors |- |FixSurvivorType |[none] |Replaces your grey survivor with a normal one |- |WinGame (Host only) |[none] |Immediately wins the current level |- |LoseGame (Host only) |[none] |Immediately lose the current level |- |SpawnObject |(see in game help) |Spawns the specified object in the world where you are currently looking. |- |name |new name |sets the local player’s name to the value provided |- |DisablePlayerBots |[none] |Disables the player bots |- |EnablePlayerBots |[none] |Enables the player bots |- |AddPassiveInventoryItem |PerkBlueprintName |Gives you a perk |- !colspan="3"|DEBUGGING - AI ENEMIES & BOTS |- |sb.ai.hub |0/1 |If not zero, the AI Debug HUB will be enabled! Allows to spawn AI and peek into the state of the AI Driver. |- |sb.ai.debugdraw |0/1 |If not zero, AI will draw debug stuff regarding their positions and mantling algorithms. |- |sb.ai.debugdrawnav |0/1 |If not zero, Bots will draw debug navigation information. |- |sb.ai.disableperception |0/1 |If not zero, Bots will not perceive any targets. Useful for checking out their unaware behavior or otherwise not getting attacked. Does not clear any targets that are already found. |} 07e11b55e0981ca5cdfad855c97b887ebfa909cd 281 280 2022-05-07T08:59:23Z Chet 3 wikitext text/x-wiki {| class="wikitable" !colspan="3"|Cheats |- |<b>Command</b> |<b>Parameters</b> |<b>Info</b> |- |sb.cheat.ammo |0/1 |If 1, all weapons have unlimited ammo (not health packs) |- |sb.cheat.fillammo |0/1 |If set players start with full ammo |- |sb.cheat.god |0/1 |If 1, the player will not take damage, or be subject to movement penalties from enemy hit reactions. ONLY WORKS ON SERVER/AUTHORITY. |- |FillAmmo |[none] |Gives the current player max ammo of every type |- |GetDown |[none] |Downs your survivor immediately |- |GetUp |[none] |Revives your survivor if downed |- |Die |[none] |Kills your survivor |- |Respawn |[none] |Respawns your survivor |- |RespawnSurvivors (Host only) |[none] |Respawns all survivors |- |FixSurvivorType |[none] |Replaces your grey survivor with a normal one |- |WinGame (Host only) |[none] |Immediately wins the current level |- |LoseGame (Host only) |[none] |Immediately lose the current level |- |SpawnObject |(see in game help) |Spawns the specified object in the world where you are currently looking. |- |name |new name |sets the local player’s name to the value provided |- |DisablePlayerBots |[none] |Disables the player bots |- |EnablePlayerBots |[none] |Enables the player bots |- |AddPassiveInventoryItem |PerkBlueprintName |Gives you a perk |- !colspan="3"|DEBUGGING - AI ENEMIES & BOTS |- |sb.ai.hub |0/1 |If not zero, the AI Debug HUB will be enabled! Allows to spawn AI and peek into the state of the AI Driver. |- |sb.ai.debugdraw |0/1 |If not zero, AI will draw debug stuff regarding their positions and mantling algorithms. |- |sb.ai.debugdrawnav |0/1 |If not zero, Bots will draw debug navigation information. |- |sb.ai.disableperception |0/1 |If not zero, Bots will not perceive any targets. Useful for checking out their unaware behavior or otherwise not getting attacked. Does not clear any targets that are already found. |- |sb.ai.braindead |0/1 |AI who are spawned while this value is not zero, will not spawn a behavior tree and thus will not navigate/attack/etc. |- |sb.ai.spew |0/1 |If not zero, AI will spew debug status to the console. |- |sb.actors.locate |0/1 |If not zero, actors will draw their locations and names on top of all geometry. Help find actors in the world. |- |isLogRec |Start/Stop |Start or stop recording of a vislog file with ‘VisLogRec Start’ / ‘VisLogRec Stop’. Will record to your local Saved directory. |- !colspan="3"|DEBUGGING - AI DIRECTOR |- |sb.ai.hub |0/1 |If not zero, the AI Debug HUB will be enabled! Allows to spawn AI and peek into the state of the AI Driver. Please note that the driver status only available for the host. |- |ForceStateOverride |AIGAMESTATE |Overrides current Driver state. Note there is a chance this can put the Driver in an unrecoverable state until start and stop. |- |NukeAllAliens |n/a |Will destroy all enemy actors in the world. |- |sb.aidriver.debugintensity |0/1 |Will render indications of what is being considered for intensity (threat will appear as coloured spheres…blue is low threat, green is med threat, yellow is high threat; stress will appear as a red number on the player. Can also look at AI Hub without this on. |- |sb.aidriver.difficulty |1/2/3 (for now) |Shifts to more or less difficult profiles for the Driver. Not a replacement for difficulty but a way to experiment with different intensity profiles. |- |sb.aidriver.disable |0/1 |Set to zero to deactivate the Driver (use NukeAllAliens to delete aliens). Note if you restart you may need to ForceOverrideState to get it to a valid state. |- |sb.aidriver.ambientspew |0/1 |If not zero, spew debug info about precaching and the ambient aliens. |- |sb.aidriver.verboselog |0/1 |If not zero, get all the logs from the Driver! Very noisy. |- |sb.driver.debuglog |0/1 |If not zero, get general logs on Driver operations (not near as noisy as verbose, helpful for debuggging) |- |sb.aidriver.statelog |0/1 |If not zero, get log messages about the state, transitions, and other relevant info to Driver state management. |- |sb.aidriver.drawall |0/1 |If not zero, will draw the locations of alien caches, and the path of the players on the gradient. Effectively is drawtilecache + drawplayervis + any other visualisation that gets added. |- |sb.aidriver.drawtilecache |0/1 |If not zero, will draw the locations of alien caches. |- |sb.aidriver.drawplayervis |0/1 |If not zero, will draw the players' paths as trails coloured by the gradient underneath. Non-persistent to save performance, but will last a few seconds. |- |sb.aidriver.teststate |0/1 |If not zero, force the Driver into a test state. This is a transient mode mostly used for dev as it’s set differently within C++ depending on what’s needed. |- |sb.aidriver.debugobjectspawning |0/1 |If not zero, will draw the location of Driver-spawned objects at start of level (needs to happen before level start) |- |sb.aidriver.spawntype |0/1/2 |If 0, normal spawn parameters, if 1 only ambients, if 2 only specials |- |sb.aidriver.logtofile |0/1 |If 1, will write debug output ../Content/DriverLogs/. This is useful for graphs and debug viewing! |- |sb.ai.cohesionlog |0.1 |If 1, will update on player’s overall cohesion and their relative groupings. Good for knowing how the Driver thinks the players are currently arranged. For a more holistic view, look at the debug logs and graphs! |- |sb.ai.playertracking |0/1 |If 1, will spew player locations and context tile information. |- |sb.aidriver.setspawnseed |# |This will set the Driver’s random seed to #. Must set before starting a level to take effect. Note that seeds are output in the Driver Logs if you want to look up a past game. |- |sb.aidriver.drawplayertile |0/1 |If 1, will draw the tile underneath the player. Useful for understanding if the player location is being interpreted correctly. |- |sb.aidriver.drawspawnradius |0/1 |If 1, will dynamically render spawn consideration radius from which the Driver is picking spawn locations. |- |sb.aidriver.drawsurfaces |0/1 |If 1, will draw the centrepoint of the spawnable surface owner, the corresponding spawn points, and the tile to which the SS maps. |- |sb.aidriver.togglehordemode |0/1 |If 1, will send back-to-back hordes with a small delay in between (will respect driver pause); if 0, will stop (will finish current active horde) |- |Once the AI hub is active |Press < and > to cycle through which AI to spawn |Press / to spawn at the position the camera is looking at. |- !colspan="3"|DEBUGGING - UTILITIES |- |sb.explorelogsonshutdown |0/1 |Will explore (open with Windows Explorer) to the log directory when the game instance is closed |- !colspan="3"|DEBUGGING - COSMETIC |- |sb.highlights.enabled |false [true] |If false, no highlights (outlines) will be shown. |- |sb.highlights.chars |false [true] |If false, no highlights (outlines) will be shown for characters, including AI. |- |sb.ui.minimal |0 [1] |If > 0, shows minimal HUD elements |- |ToggleHUD |N/A (Exec func) |Call this from the console to toggle the entire HUD on/off |} a651457f32af4536f47fe5cce52734350989d8f8 Main Page 0 1 282 173 2022-05-07T21:05:07Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] *[[Holdout Quickstart Guide]] 1c93e893e6d2e62098bda8a6dcb8e0c89a8e4d57 283 282 2022-05-07T21:08:02Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] Additional Pages *[[Holdout Quickstart Guide]] *[[Developer Cheats and Debug CVars‎‎]] *[[Doors]] *[[EmitterToggleable]] *[[Toggleable Lights]] *[[General Music]] *[[Event Music]] *[[Conveyor/Fans]] *[[Progress Meters]] *[[Jump Pads]] bd3e878aceb7623c9601421e205f1a35673dbe68 284 283 2022-05-07T21:08:26Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] == Additional Pages == *[[Holdout Quickstart Guide]] *[[Developer Cheats and Debug CVars‎‎]] *[[Doors]] *[[EmitterToggleable]] *[[Toggleable Lights]] *[[General Music]] *[[Event Music]] *[[Conveyor/Fans]] *[[Progress Meters]] *[[Jump Pads]] 6da8cb4dd3e7ed727a91638f8e5327efb9193ce1 285 284 2022-05-07T21:08:41Z Chet 3 /* Additional Pages */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] a89e40f2717231c8d3940a5ece48748cf7a6241d 286 285 2022-05-07T21:09:05Z Chet 3 /* Additional Pages */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 6433978d8184d2c5e3147b15dd18eacb1963c185 Installing the Mod Kit 0 50 287 137 2022-05-07T21:32:39Z Chet 3 /* Setting up your workspace */ wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick no to updating Wwise |- | [[file:Preset1Capture.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick not now for the update |- | [[file:Preset2.PNG]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Pick Don't Import for content files. |- | [[file:Preset3.PNG]] |} Once you've got the Mod Kit running look to the toolbar and click "Create Mod" {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModToolBarCreate.png]] |} That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:CreateMod.png]] |} ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:NewDataAsset.png]] |} Select ModInfo {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:SelectModInfoDataAsset.png]] |} You can name this whatever you like, once created open it up and fill out the info {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ModInfo.png]] |} One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. 729bf9a9e39d64ab3b420f61282dfdc7145ba7c1 288 287 2022-05-07T21:34:08Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. f71fc1eeda4e70f75f851ee4f11a1eacbc1d8e52 289 288 2022-05-07T21:34:24Z Chet 3 /* Setting up the Mod */ wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. d61c642768845e52ca91e795eb9138fc3f28baf9 Making A Map 0 3 290 136 2022-05-07T21:36:23Z Chet 3 /* Creating your first Map */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG]] Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 15dfc478c597fda4482845179d14a2b81a022c55 291 290 2022-05-07T21:36:56Z Chet 3 /* Setting Navigation */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap c7837e121c19712ec940656bd2d5a5cc0ab9a88b Blocking Out A Map 0 8 292 170 2022-05-07T21:38:59Z Chet 3 wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] |} <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png]] |} <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] |} <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png]] |} <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png]] |} <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png]] |} <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png]] |} <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png]] |} ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] c0d43d78cd501762f30434fe615319e0cf5646ea 293 292 2022-05-07T21:41:51Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png]] |} These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] ba4ca300ff83b85b54524b5065d2e24fe15845d5 294 293 2022-05-07T21:43:44Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 1befe955c52cd745140563c0d9d44afb9f9944c4 295 294 2022-05-07T21:44:14Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 394a90746f9ab7d0817a8ee539e7c2451580cf6f 296 295 2022-05-07T21:45:08Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] a0852b5080303fcd6b05d2709a67ff9e8db08b80 297 296 2022-05-07T21:45:39Z Chet 3 /* Path Buddies */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] |} #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png]] |} The following flags are set: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] |} I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png]] |} When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png]] |} The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 959b5751ee4f72c038ea7d6206d2137572d262f8 298 297 2022-05-07T21:47:47Z Chet 3 /* Level Context Volumes */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png|none|1000px]] The following flags are set: [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png|none|1000px]] When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png|none|1000px]] The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] |} This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] |} #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] a506d20c1c69443ba86dd99d1a85bd7e73e49ed8 299 298 2022-05-07T21:48:54Z Chet 3 /* Nav Modifier Volumes */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png|none|1000px]] The following flags are set: [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png|none|1000px]] When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png|none|1000px]] The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png|none|1000px]] [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] |} This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 6dbc0b7d61afdb1b94669ca4f6393da83a7c2c9e 300 299 2022-05-07T21:49:47Z Chet 3 /* Debugging the Context */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png|none|1000px]] The following flags are set: [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png|none|1000px]] When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png|none|1000px]] The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png|none|1000px]] [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Example feeder room often used near side paths. |- | [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png]] |} ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 4916165f2e8f9edde2fecfc8da12d643cd3f3530 Blocking Out A Map 0 8 301 300 2022-05-07T21:50:33Z Chet 3 /* Feeder Rooms / Room Prefabs */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png|none|1000px]] The following flags are set: [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png|none|1000px]] When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png|none|1000px]] The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png|none|1000px]] [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. Example feeder room often used near side paths. [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png|none|1000px]] ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] |} Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Precomputed Lighting Disabled on World Settings |- | [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] |} ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] df5903eb85bbe818c63c007c57e2f167cd102adc 302 301 2022-05-07T21:52:55Z Chet 3 /* Blockout Lighting */ wikitext text/x-wiki In this tutorial we’re going to blockout the level to include some of typical scenarios in a Anacrusis level. It will also cover the various set of actors we use to inform the driver about this world so it can do its best spawning enemies & items. This tutorial continues from the last tutorial, [[Making A Map]]. ===Blockout=== First some general tips and things to consider: <ol><li>We try to keep the level boundaries on the 100 grid. Most of our meshes such as walls and trims are built in modular chunks that fit to the 100 grid, there are exceptions but you’ll find most of our assets work better if you conform to this rule. <li>Maps usually have a main path and side paths. The side paths areas allow players to explore, find goodies, but they’re also meant as a lure to try to separate the team and allow special enemies to ambush players. Higher value items tend to appear on side paths to increase the chances of this happening. <li>Maps tend to have enemy only spawn areas sprinkled throughout that players cannot see into. For example a blocked off room that enemies can jump down from, or a broken out ceiling or wall. We do this for several reasons: <ol><li>Once an area is seen by a player that area gets marked as unspawnable for a limited amount of time. So for example if you walk into a bathroom and see no enemies and walk out of the bathroom you won’t see a large group of enemies spawn from that room. Creating inaccessible spawn areas helps the driver find spots to spawn enemies if needed.</li> <li>These are helpful for holdout events where we need large sets of enemies spawning in waves but don’t want the spawning to be visible to the player(s).</li> <li>This is helpful in side paths. If a player wanders off to a side area the driver can spawn specials and attempt an ambush.</li></ol> <li>There’s a few things we do throughout entire maps to help combat feel better. <OL><li>We sprinkle in obstacles and break up spaces so that common enemies need to climb or navigate indirectly towards players. Think of this as a large scale pachinko machine. This helps to slow them down but also makes them a more interesting target to shoot at. <LI>We try to avoid very large sightlines. It’s okay to occasionally break this rule but our common enemy tend to appear less interesting and threatening when they have to sprint over a large visible distance before arriving at the player. This also impacts the drivers ability to spawn enemies and dynamically tune intensity. As mentioned earlier, if you can see far across your map this means a large set of your map is now marked as unable to spawn enemies. This can impact pacing and reduce the amount of spawned enemies. (To compensate you’ll see we often give the illusion of large spaces by making the super structure or ceilings of rooms visible but block off sight across those large rooms with rubble or low height structures.) <LI>Plan your work! I typically write-up a plan that covers the objectives, story, and areas we plan to visit. I gather reference images and concepts into this plan. What were these areas on the Anacrusis ship before the disaster? What new gameplay ideas are being introduced? I also do a simple box diagram thinking about how the various areas connect together and how big they may be. I believe most the magic happens in 3D so I don’t spend a lot of time here but its good to have a plan. </li></li></ol></ol> ===Tools for blocking out geometry:=== <ol> <li>BSP - UE4 has built in BSP tools and a large amount of examples and documentation but there are other tools available. <li>[https://www.unrealengine.com/marketplace/en-US/item/1d33484b0daa4a6d8b3db900c69fb8a9 Blockout Tool] - This is a nice plugin available in the Stray Bombay build that makes blocking out maps quick and easy. Tools are under Place Actors Blockout Tools. We’ve just started using this ourselves. <li>Modo/Maya/Max - We used modo for most of Anacrusis. It’s a fast and powerful modeling package with a method to directly link with UE4 making importing/exporting instantaneous. One drawback is that once blockout meshes are in the editor they’re not easily editable and you usually have to return to Modo. <li>Sketchup - Haven’t used this myself but many designers use sketchup. </li></ol> This is the hard / fun part! Good luck! We blockout levels then test over and over, gathering feedback from playtesters, then iterate. Once we’re happy with gameplay we move on to the art/lighting/fx/sound pass. We’ll cover tutorials on those later too. Here we have a quick blockout [[file:Blockout.png|none|1000px]] This blockout contains many of the elements described above. For example we have side paths in this blockout and some enemy only spawn areas. This blockout has few examples we’ll need for the driver in the next section. ===Working with the Director=== <b>Auto-nullify</b> One of the first unique things you’ll notice about navmesh in Anacrusis is that in some areas navmesh will not appear solid: [[file:Dbbe9289-c0b4-4fc5-ba8d-332b7f96e59a.png|none|1000px]] Navmesh that isn’t connected by navlinks is considered disconnected from the gameplay area and is automatically “auto-nullified”. You’ll see in a default branch of UE4 navmesh generates everywhere it can, including inside geometry. This was causing problems since the driver utilizes the navmesh to figure out where enemies can spawn. As mentioned earlier, navmesh in Anacrusis should only exist in valid gameplay areas. <b>Automatic Navlinks</b> To connect areas automatically we have created a tool to automatically add navlinks. To run this go to SBTools->Nav Link Options->Generate Navlinks W/ Full Nav Rebuild: [[file:9027d0d8-fbcb-4d79-9543-ceb52c7d3f14.png|none|1000px]] If you’re working in an area that already is connected but you make a slight modification like adding a small prop then you can run SBTools- >Generate Nav Links instead. This is a bit faster does not always connect disconnected areas. You should now see navlinks across your entire level: [[file:168498de-bfae-463a-8a0c-ccb0ed6256ab.png|none|1000px]] Navlinks only generate where enemies & player bots in the game can climb and jump. If an area is disconnected review the collision and try another height. Enemies can climb up 5m and drop down 15m. If an area is connected that you do not want you can use BlockingVolumes with the collision profile BlockOnlyNavlinks to block navlinks from connecting an area. ===Path Buddies=== If you build the context now and turn on the golden path you’ll see some areas with black tiles: {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:3778b4c2-2933-4fda-8875-effbc623a7cd.png]] | [[file:4277880e-9f47-430d-b3aa-bd14e3c1ce56.png]] |} [[file:4771381d-97c8-45af-b6e2-4c665c0e6d53.png|none|1000px]] These are areas that need to be connected with PathBuddies. <ol><li>First make your level context sublevel current in the level browser by double clicking. PathBuddies must be in the same sublevel as the LevelContextBP actor: [[file:4aab6147-a80a-42aa-8189-c8532b507619.png|none|1000px]] <li>Next place a PathBuddy actor, Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/PathBuddyBP' on the area with black tiles and one on the area with colored tiles: [[file:5bb1130e-bfd0-487a-83b4-728d59a93170.png|none|1000px]] <li>Select one of the PathBuddies. Then click the eye drop tool on the MyBuddy property: [[file:b85c33e2-75e1-4655-8670-86f98db1e7fe.png|none|800px]] <li>Select the other PathBuddy to link an area and automatically add it to the LevelContext. Pairs can also be manually added from the PathBuddies list on the LevelContextBP actor. <li>To remove PathBuddy pairs from the LevelContext you can clear the MyBuddy property on a PathBuddy. You can also remove pairs manually from the PathBuddies list on the LevelContextBP actor. <li>If you compile and enable the golden path you should now see the area connected: [[file:342736c5-a2dd-4f58-a1b9-93d05bb78bcc.png|none|1000px]] <li>You’ll need to repeat these steps throughout your entire level. Do your best to place the buddies near where you expect enemies to drop down. Every tile has a score that represents the distance from the end of the level. The driver looks at this score then uses this info to decide where to spawn enemies ahead of the player. Tile distances are calculated by finding a path on the tiles to the goal, for areas connected by PathBuddies the path must go through a PathBuddy. <li>For example, this area to the right is green matching a previous area that is further from the goal. This is because the distance score must go to the PathBuddy first then to the goal: [[file:e80ae3a6-7b3a-4962-80b3-b112b53500ca.png|none|1000px]] <li>If I add a pair of PathBuddies at the end of this platform the tiles at the end of the platform will have a more accurate score: [[file:d385abfa-c2cb-423d-855d-0ecd160872e5.png|none|1000px]] <li>For this same reason you’ll sometimes need to use PathBuddies to connect areas that already have colored tiles: [[file:afe565ca-1aac-4527-880b-1b6902d1d820.png|none|1000px]] <li>We are adding PathBuddies since players can navigate down here. The distance scores will be more accurate representing the shortest path to the level goal. </li></ol> If you play now (Alt + P) you should have a mostly working Anacrusis level. [[file:ea4ce7e5-2f94-4ecf-917d-3f52df9501a5.png|none|1000px]] ===Level Context Volumes=== Level context volumes allow us to markup context tiles with special flags. [[file:e7d2391b-817e-44de-9139-f627d575c3f4.png]] #No Gradient - This prevents an area from creating valid tiles. This is rarely needed to help guide the golden path. #No Spawning - Any area where you do not want enemies to spawn. Airlocks are set to not allow enemy spawning for example. #No Egg Spawns - Eggs are a more challenging enemy so occasionally we markup areas to not allow eggs to spawn. For example eggs are sometimes disallowed from spawning in holdout areas. You’ll need to markup areas player cannot reach as no egg spawns as well otherwise they can be skipped. #Spawn Aggro Only - This prevents wanderer commons from spawning in enemy only spawn areas. Wanderers are oblivious to players until shot, if they’re in an area player cannot reach they will be skipped. #No Item Spawns - Disallow item spawning in areas player cannot reach. #Discoverability Override - Valuable items prefer to spawn in hard to see areas off the main path. You can make an area have low discoverability to increase its chances to spawn valuable items. #Force Hidden - As mentioned earlier, once an area is seen it prevents enemies spawning for a limited amount of time. Every tile in the context holds a list of all other tiles it can see plus a small bit a buffer so tiles can see slightly around corners. This buffer sometimes causes areas that are hidden as being marked as seen. To prevent this enemy only spawn areas that aren’t visible are often set to force hidden. #Unshootable Area - When an area is inaccessible by players you’ll need to mark the area so it cannot spawn items and tell the Driver that it is an “unshootable area.” An unshootable area tells certain specials like the spawner to not stay in the spawn area for too long so it can be defeated. As mentioned earlier, you’ll want to setup enemy only spawn areas that ideally players cannot see into or navigate into. Here I’ve placed a LevelContextVolume in a enemy only spawn area: [[file:3206ff65-1abe-44f9-a78b-faf48e35476b.png|none|1000px]] The following flags are set: [[file:f2734ba5-f7d4-4973-b108-be55d3ce6ee6.png]] I’ve placed a wall to hide enemy spawns and behind the wall I’ve placed another LevelContextVolume with the ForceHidden flag set to true: [[file:c1a1ffc1-bcae-4f75-9ca7-b15b0ff5219b.png|none|1000px]] When more than one LevelContextVolume overlaps a tile it will have all the flags set from both the volumes. There is also an actor called Volume_Fog which is used to hide visibility into spawn areas. Blueprint'/Game/Environment/Gameplay/Fog/Volume_Fog' I’ve placed one back behind this wall: [[file:4e79730a-fc19-4ee7-9bbd-915037e8634f.png|none|1000px]] The fog volume sticks out visually with the current lighting but once a map has proper lighting pass these are often less obvious. Repeat this process for the rest of your level. ===Nav Modifier Volumes=== Occasionally you’ll need to modify the navmesh using these volumes. The main setting used is NavArea_Null on the area class: [[file:07a13c52-cee3-4f7b-9d6b-e4e4afa68ba0.png]] This removes navmesh. For example I’ve removed navmesh above the airlock exit because I do not want enemies dropping down on top of the player: [[file:fcaa1ab5-2813-4412-abfd-2cbb0ed14279.png|none|1000px]] [[file:eac4a6e7-1585-4303-a5d9-88356091d00c.png]] #AIObstacle - This makes a path very expensive for both player bots and enemies. Used if for some reason you prefer your AI to move around an area. #EnemyAIObstacle - Same as above except only for enemies. #PlayerAIObstacle - Same as above except only for player bots. #CheapPath - The makes a path cheaper and more likely to be used. Often used when enemies are climbing onto things versus staying on their current floor. #EnvHazard - Used on things like fire. It will be avoided but enemies can still use the path. Wanderers will not walk into EnvHazard areas, but alerted common will run through these areas. Special enemies are more intelligent and will always avoid these areas. #SpecialsOnly - These areas can only be navigated by specials. #GenLinks are used for automatic NavLinks, you can ignore those. The rest are UE4 defaults or old settings we do not use. ===Debugging the Context=== Besides drawing the golden path, as mentioned in the first tutorial, there’s also an actor known as the LevelContextDebugGridRenderer. [[file:9ecfed34-25f0-4727-81d3-5d6f75bba073.png]] This actor can be used to visual data from the context to assist in debugging issues. Place one under: Blueprint'/Game/Environment/Gameplay/Utils/LevelContextDebugGridRenderer' #Local Spawn Points - Shows valid spawn points from this actors location. This is helpful in showing which spawn points would be valid if you were a player standing in this location. #Visible Tiles - Shows which tiles are visible from this actors location. Recall from earlier that any spawn locations the player can see are invalidated for a fixed amount of time. #Topography - Shows all tiles and generates a directional pattern. #Spawn Points - Shows all enemy spawn points, ignoring this actors location. #Item Spawn Points - Shows all item spawn points, ignoring this actors location. #Golden Path - Shows the quickest path from the map start to the map end. ===Feeder Rooms / Room Prefabs=== A set of hallways, rooms, and feeder room prefabs exist under: Environment/Meshes/Station1/FeederRooms/ Feeder rooms are side rooms that are blocked off to players. These are often used to spawn enemies. Example feeder room often used near side paths. [[file:a15a6ac2-e92c-4062-9a28-11b5d947c7ea.png|none|1000px]] ===Blockout Lighting=== At stray bombay we blockout with movable lights and remove precomputed lighting to save on iteration time. Building and managing static lighting is very time consuming so we save this pass for later once a level gameplay has been solidified and art assets have been placed. Precomputed Lighting Disabled on World Settings [[file:d7375577-00b8-4fa1-8e90-f4cf8da841fc.png]] Movable lights are a lot more expensive than static lights and can be more expensive than stationary lights, especially if you have a lot of movable lights. To help reduce the cost of movable lights you can disable shadow casting. You can also set the max draw distance and a fade distance so lights far off in another part of the level are not adding to the expense: Precomputed Lighting Disabled on World Settings [[file:918f85a8-c620-4672-bd33-9e0d4547d40c.png]] ===Iterate!=== That’s it for this tutorial. Next we’ll cover setting up holdouts and various other gameplay actors. Blockout is the key phase of map development. Test your level at this phase early and often until you’re happy with the gameplay. This example map is located under: World'/Game/Maps/Tutorials/02_Blockout_and_Driver' A full example map is available under: World'/Game/Maps/Station_1/Campaign_2/Level_1/s1c2l1_depot' A map containing our standards for jump heights, door sizes, wall thickness, and more can be found here: World'/Game/Maps/Test/Standards' Next up: [[Holdouts & Activation Systems]] 2919cd68ec4802ee0066bf5d15e6ac6b9bb39e6e File:C50b3687-0df9-406f-a9fb-36709bef3159.png 6 151 303 2022-05-07T21:54:00Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Main Page 0 1 304 286 2022-05-07T23:32:20Z Chet 3 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial (Incomplete)]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] bc0fb25ce2f9cfca58a79e1fb728df8149da6e25 305 304 2022-05-07T23:32:33Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] efe30d55c27cd51306f907b5e8cd9798160edc23 311 305 2022-05-08T00:13:46Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 74c8130b30b3cf8c3ab37e502608b6bb2aff1dfe 345 311 2022-05-08T20:23:55Z Chet 3 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 2c497c305af4ad82a4e5b04c66e4bef1014ce000 File:D74cdca7-00a7-43aa-9e3a-d6502603968c.jpg 6 152 306 2022-05-07T23:38:46Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Baked Lighting Tutorial 0 153 307 2022-05-07T23:41:30Z Chet 3 Created page with "===Adding Lights to your map=== This is an A to Z description of how to light levels, when & where to use static, stationary, and movable lights, and how to setup GPU lightmass. Lighting Basics: Epic has a very extensive break down of lighting systems for Unreal 4. I highly recommend going through their [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/QuickStart/ Quick Start Guide] if this is your first time lighting inside the engine. Once..." wikitext text/x-wiki ===Adding Lights to your map=== This is an A to Z description of how to light levels, when & where to use static, stationary, and movable lights, and how to setup GPU lightmass. Lighting Basics: Epic has a very extensive break down of lighting systems for Unreal 4. I highly recommend going through their [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/QuickStart/ Quick Start Guide] if this is your first time lighting inside the engine. Once you have replaced your whitebox with art assets. It is time to add lights. [[file:d74cdca7-00a7-43aa-9e3a-d6502603968c.jpg|none|1000px]] ==Prep Work== Add Reflection Capture Actors: [https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Reflections/ Reflection capture actors] simulate reflection data into the environment. They are essential for Physically Based pipelines, particularly for metallic surfaces. They come in two types Sphere Reflection Capture Actors and Box Reflection Capture Actors. Sphere Reflection Capture - The most widely used capture actors in real-time projects. Their accuracy is based on their influence radius and the project's Reflection Capture Resolution size. Smaller radius means more accurate reflections, but be aware that there is a limit to how many of those actors you can have per map. Box Reflection Capture - Used to simulate boxed reflections, like a wall made of mirrors. Usually more expensive than the Sphere, and objects close to the Actor center (near the reflection sprite in the center of the box volume), will appear very large in the reflection Add Lightmass Importance Volumes [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Lightmass/VolumetricLightmaps/ Lightmass Importance Volume] - Used to prioritize light bouncing. Usually cover just the playable area of a map. Also affects Volumetric Lightmap Detail Cells. ==Add Lights== 7f2050440069bc8df1964b8252b2890046983deb 310 307 2022-05-08T00:09:53Z Chet 3 wikitext text/x-wiki ===Adding Lights to your map=== This is an A to Z description of how to light levels, when & where to use static, stationary, and movable lights, and how to setup GPU lightmass. Lighting Basics: Epic has a very extensive break down of lighting systems for Unreal 4. I highly recommend going through their [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/QuickStart/ Quick Start Guide] if this is your first time lighting inside the engine. Once you have replaced your whitebox with art assets. It is time to add lights. [[file:d74cdca7-00a7-43aa-9e3a-d6502603968c.jpg|none|1000px]] ==Prep Work== Add Reflection Capture Actors: [https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Reflections/ Reflection capture actors] simulate reflection data into the environment. They are essential for Physically Based pipelines, particularly for metallic surfaces. They come in two types Sphere Reflection Capture Actors and Box Reflection Capture Actors. Sphere Reflection Capture - The most widely used capture actors in real-time projects. Their accuracy is based on their influence radius and the project's Reflection Capture Resolution size. Smaller radius means more accurate reflections, but be aware that there is a limit to how many of those actors you can have per map. Box Reflection Capture - Used to simulate boxed reflections, like a wall made of mirrors. Usually more expensive than the Sphere, and objects close to the Actor center (near the reflection sprite in the center of the box volume), will appear very large in the reflection Add Lightmass Importance Volumes [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Lightmass/VolumetricLightmaps/ Lightmass Importance Volume] - Used to prioritize light bouncing. Usually cover just the playable area of a map. Also affects Volumetric Lightmap Detail Cells. ==Add Lights== A quick recap of the types of [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/Basics/ Light actors in UE4] by order in which they are placed in maps (usually) Sky Light - Creates even lighting, as if from overcast sky. It can capture bounced light in real time or use a Cubemap function to override it with the color information of a HDRI image. Directional Light - Simulates sunlight. Usually the first, most indispensable light source, optional in space. Spot Light - Emits light from a single point in a cone shape. The cheapest of all light actors. Used for most artificial light settings. Point Light - Emits light in all directions, as if from a light bulb. The most expensive of light actors. Often used as fill lights. (With 'Cast Shadows' turned off) Rect Lights - Emit light from a rectangular shape. Usually used for squared lamps. Supported with Epic's Official GPU Lightmass. Not currently supported in Luoshang's GPU Lightmass third-party plugin. ==Light Mobility Settings== Static - Only influences the light bake and volumetric details. Cheapest kind of light. Stationary - Technically, it works like two lights. One static that bakes into the map, and one moveable, that can affect characters, and other moving objects and be changed on runtime. Movable - Does not bake during the light build. Can be updated on runtime. When to use each mobility setting? There is no hard rule for which type or mobility setting to use. It is up to each individual need. Stationary lights look the best on characters and enemies but are the most expensive. Movable are well suited for screens or smaller areas, static lights fill out the environment and shape the overall lighting of a map with little cost. example map with lights, reflection actors, lightmass importance volume [[file:0820d39e-5a05-4d49-b7f5-c8e24afc6580.jpg|none|1000px]] ==Finishing touches== Add a Exponential Height Fog Fog actors can be used to create a variety of different types of fog and atmospheric effects to a level. [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/FogEffects/VolumetricFog/ Exponential Height Fog’s] are the most widely used at the moment and allow for volumetric fog effects (which can also be further customized in each individual light. Add a [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/PostProcessEffects/ Post Process Volume] Anacrusis uses a general Post Process Volume: Content/Environment/Gameplay/PostProcess/PostProcessVolume_Space.uasset But feel free to create your own. Post Process Volumes can be controlled by blueprints to change during runtime. Bake Lights! To bake your lights, go to Build - Build Lighting Only. Lighting Quality affects the amount of light bouncing in the map, so preview takes less time to bake than production. It does not affect light bake times in GPU Lightmass. That is controlled by the settings in BaseLightmass.ini. Even more Lightmass settings can be found in Window/World Settings. final baked map, with post processing volume and volumetric height fog [[file:467ad4c3-feae-4d8d-ad37-ef569799c79d.jpg|none|1000px]] Why Bake Lights? Unreal 4's light baking system allows you to have high quality results that would be expensive to replicate with movable/dynamic lighting. It bakes the light and shadow information and overlays that on top of the assets in the game using light and shadowmaps. It can be an onerous process during map creation but it saves a lot of memory space during runtime that would otherwise be taken by movable/dynamic lights. Difference between CPU and GPU Lightmass: CPU lightmass is the traditional baking light system for UE4. It has extensive documentation and support, and can make full use of the Lightmass options in Window/World Settings. Unfortunately, baking an entire level in production quality with CPU lightmass will take a very long time (about 8 hours with a single computer, about 2 hours for a multiple-computer Swarm cluster) Enters GPU Lightmass. Developed for Unreal originally as a third-party plugin in 4.19, Introduced officially to Unreal 4 in 4.26. (And the predominant light-baking solution for Unreal 5). It uses a computer's GPU to generate and build lighting data which allows it to leverage DX12 and Raytracing graphic improvements. Currently, Stray Bombay uses [https://forums.unrealengine.com/t/luoshuangs-gpulightmass/109474 Luoshang's GPU Lightmass plugin] to bake lighting. Unreal's official GPU Lightmass documentation [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/GPULightmass/ GPU Lightmass Global Illumination] ==Common Questions== Why do I have an x on my light actor? / My light is not visible in-game! Unreal 4 only supports up to 4 overlapping stationary lights. You can check for overlapping stationary lights on View Mode - Optimization View Modes - Stationary Light Overlap My shadows look bad/blurry! Increase lightmap resolution on an actor instance / static mesh editor. You can see the size of each lightmap in your level is on View Mode - Optimization View Modes - Lightmap Density. Blue represents small texture sizes, red is too large. Be aware that higher lightmap sizes reduce performance/increases the map's memory size. How do I get my light to blink/move? Light Functions! They can also be controlled by Blueprints to blink or move to specific points/when certain conditions are met. Content/Environment/Materials/LightFunctions/ - Has some of the Light Functions created for the Anacrusis. But you can find many more in the Marketplace store or make your own. ==More information on lighting in Unreal 4== [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/ Lighting the Environment] - Epic Unreal 4 Lighting documentation [https://www.youtube.com/user/51Daedalus 51Daedalus] - Unreal Lighting Academy [https://youtu.be/RBY82TSLjFA Lighting with GPU Lightmass | Tips & Tricks | Unreal Engine] - Basics of using official GPU Lightmass [https://forums.unrealengine.com/t/luoshuangs-gpulightmass/109474 Luoshuang's GPULightmass] - Luoshuang's GPU Lightmass thread [https://youtu.be/ihg4uirMcec Lighting with Unreal Engine Masterclass | Unreal Dev Day Montreal 2017 | Unreal Engine] - Lighting with Unreal Engine Masterclass da9acb023027546bcb1321af4ccdb8063de4c711 File:0820d39e-5a05-4d49-b7f5-c8e24afc6580.jpg 6 154 308 2022-05-08T00:01:13Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:467ad4c3-feae-4d8d-ad37-ef569799c79d.jpg 6 155 309 2022-05-08T00:05:46Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:149a84b2-09e8-48f7-a99c-988deb76d65a.png 6 156 312 2022-05-08T00:17:00Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Be7903aa-4dd6-4250-97f7-4ecb120f6f06.png 6 157 313 2022-05-08T00:17:56Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png 6 158 314 2022-05-08T00:18:39Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png 6 159 315 2022-05-08T00:19:00Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:448380be-477a-4f31-b48a-a379259d0913.png 6 160 316 2022-05-08T00:19:39Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:E3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png 6 161 317 2022-05-08T00:20:05Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A80ee23a-40cf-4ed8-ad5b-da2dba26621d.png 6 162 318 2022-05-08T00:20:31Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:B9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png 6 163 319 2022-05-08T00:21:06Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:04000338-e8ea-4bb5-af6d-1af4604ad498.png 6 164 320 2022-05-08T00:21:29Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:2348925f-c3c7-473c-b78a-93cb40dd2289.png 6 165 321 2022-05-08T00:22:26Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7cc1d70a-2077-450f-9129-4b07fc434aac.png 6 166 322 2022-05-08T00:22:51Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Lighting & Level Optimization 0 167 323 2022-05-08T00:23:01Z Chet 3 Created page with "===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows fro..." wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] 7848c558ff699349c0d374215fedcdb6c7e84575 330 323 2022-05-08T00:40:13Z Chet 3 wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. 4de09f56c9db54e5339d9ec9269a1a9bde939dc0 334 330 2022-05-08T04:33:55Z Chet 3 wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. 095b7bf6e1da45f98af8f163d4ffb87f6f4c9ca8 336 334 2022-05-08T04:40:05Z Chet 3 wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <source> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </source> 45d216817b1e1f8d33e3e3bfc6b14d7db3981bac 337 336 2022-05-08T04:41:02Z Chet 3 wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <source> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </source> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. 84f0ea03b6cd77df317a2ee33167f6c34ea0cbe7 338 337 2022-05-08T04:41:25Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <source> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </source> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. dd9b9e1c57072385fa2eaba4db327230cc67698a 339 338 2022-05-08T04:43:50Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. 2e850405918a5a955f8e6bbe8e75481dff769c41 340 339 2022-05-08T04:44:10Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. b011e1debe58b776f35c794842860ebaf7d074e8 341 340 2022-05-08T04:50:52Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. 1a6a5aa8c9f7d0fa3f13dd5e14c6955d7fa43979 342 341 2022-05-08T04:53:34Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. 03691b928f0318b2da5c041bced864853047fbe6 343 342 2022-05-08T04:53:58Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. a77e2d7e9b7f8be2c7c9b7d839b43d216c08b67a 344 343 2022-05-08T04:54:22Z Chet 3 /* Cull Distance Volumes */ wikitext text/x-wiki ===Lighting & Level Optimization=== Below is a list of performance related steps to take before shipping a map. Because this game features lots of enemies we have to carefully lookout for a few things to keep performance high. ==Enable Distance Fields Shadows on All Stationary Lights== For any PointLight, SpotLight, RectLight, or DirectionalLight that are stationary and casts shadows you will want to enable distance field shadows. <b>Why do we do this?</b> Shadows from stationary lights are very expensive when lots of dynamic actors are in its field of view. For example, hordes of killer aliens. Typically stationary lights aren’t too bad in games with 4-8 enemies, but in Anacrusis this can dramatically reduce framerate. In computer science world this is known as a O(n2) problem. For every dynamic actors that’s in the field of view of a stationary light, shadows have to potentially be calculated for every other dynamic actor. If you type “stat GPU” typically high shadow costs show up as both shadows & as “occlusion queries.” Shadows and occlusion queries are typically the highest cost. If you want your map to run at good framerate the steps on this page need to be taken. If you have not yet baked lighting, you will notice when the Distance Fields Shadows flag is set to true sometimes shadows will appear to have errors. This can be ignored for the most part. All shadows will look normal once baked, and distance field shadows will only be used on dynamic objects such as enemies or doors. It is occasionally worth adjusting light positions if you see large errors, this may mean your light is embedded in the distance fields representation of the world and may simply be too close to a wall or light fixture. For example here we see an error once distance field shadows are enabled: [[file:149a84b2-09e8-48f7-a99c-988deb76d65a.png|none|1000px]] Simply move the light down a bit so its not longer penetrating geometry: [[file:be7903aa-4dd6-4250-97f7-4ecb120f6f06.png|none|1000px]] To enable visualization of mesh distance fields go to show->visualize->mesh distance fields in the 3D viewport: [[file:9d23a4dd-a4ad-4a36-a08e-5392cbbdf129.png]] [[file:0e118ea5-cb9b-42c1-9ebb-c9478a9f9cae.png|none|1000px]] Here you can see the MDF version of the world isn’t perfect. Its a voxel like representation of the world. We have created a tool to quickly select all stationary shadow casting lights of any light class. Right click any light then go to Scripted Actions->Select Shadow Casting Stationary Lights [[file:448380be-477a-4f31-b48a-a379259d0913.png]] You should see this pop-up, start with SpotLight: [[file:e3218912-cb19-4c75-9a0a-5f5af8f4b9d1.png]] You will notice the Details panel appears empty after hitting ok but you should see several actors selected in the outliner: [[file:a80ee23a-40cf-4ed8-ad5b-da2dba26621d.png]] This is a bug in UE4 scripted tools. Unclick one of the selected actors in the world outliner then reselect it. You should now have all actors of SpotLight class selected that should have distance fields shadows enabled: [[file:b9ac7e8e-a4c8-4be7-974c-5b02b1dadd4c.png]] Type in distance fields in the search bar and set the flag to true: [[file:04000338-e8ea-4bb5-af6d-1af4604ad498.png]] These step will need to be repeated for every light class - PointLight, RectLight, SpotLight, and DirectionalLight. You can ignore the toggleable & generated classes, they will automatically get selected with these other options. ==Enable Distance Fields Shadows on All Movable Lights== Just like stationary lights, you will want to enable distance field shadows on as many movable lights as you can. Unlike stationary lights the distance field shadows will not look better after baking as they’re fully dynamic lights. For this reason we only enable DF shadows on movable lights that look good. There is a script to select all movable lights just like the stationary lights script: [[file:2348925f-c3c7-473c-b78a-93cb40dd2289.png]] Unlike the previous step, we will need to review each light individually to make sure there isn’t visual issues with enabling DF shadows. To do this I setup a temporary group in the world outliner by right clicking one of the selected actors then choosing Move-To->Create New Folder: [[file:7cc1d70a-2077-450f-9129-4b07fc434aac.png]] For SpotLights I’ve temporarily created a group called MovableShadowCastingSpotlights: [[file:4743a7a8-6cfa-4d15-a003-10007ea60dac.png]] You can then double click each actor to jump to it and review how it looks with DF shadows enabled. Sometimes increasing the radius on the light can improve the look of DF shadows. Higher radii values will make shadows blur the further they get from the light source. [[file:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png|none|1000px]] 0 radius you can see crisp sharp shadows on the white walkway side walls in the bottom left. [[file:bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png|none|1000px]] 75 radius soften the shadows. Be cautious when increasing radius, as mentioned in the previous step, increasing the light source area can result in shadow artifacts if this area is clipping into geometry. You can increase light radius in the previous step with stationary lights too! By default with stationary lights you will only see this softening of shadows effect from dynamic actors like enemies. To also soften shadows on static objects you can set “Use Area Shadows for Stationary Light” to true: [[file:36110bfe-ee57-47db-bafd-d213c8d71779.png]] ==Set Max Draw Distance and Max Distance Fade Range on Movable & Stationary Lights== Every movable and stationary light needs to also manually have its distance fade values tuned. This fully disables these lights (and shadows) past the max distance. <b>Why do we do this?</b> We do this for the same reason we optimize distance field shadows: to reduce occlusion queries, and light & shadow costs from lots of dynamic actors. This step will disable lights on the other side of the map that cannot be seen by any of the players. To quickly find these lights that need this optimization there’s a script you can use to select all optimized lights then you can hide them. This script will select all lights that have already set these values or if the lights are static. Static lights do not need this optimization since they do not effect dynamic actors. Right click any actor then select Scripted Actions->Select Optimized Lights: [[file:4b1ab97c-ebca-4c5c-b081-661201d60752.png]] Hit H to hide them or right click, Visibility->Hide Selected. Now in the world outliner type “Light”. Any PointLight, SpotLight, RectLight, DirectionalLight, and all Toggleable versions that are still visible need to have fade distances set. Select one and type perf in the search bar to quickly isolate the values that need to be set: [[file:7ad90d76-6933-4af2-b7da-4b48d562c23c.png]] Typically I set a Fade Range of 1000, but in large areas a value of 2000 is less noticeable. Then I set a value of about 3000-5000 for the Max Draw Distance. Your goal is to get the max draw distance as low as possible without it being noticeable. A low fade range works for lights around corners and hidden away such as side rooms or closets. To do this I find the furthest point in the 3D viewport where the light is visible then use the mouse slider to click-hold and tune the max draw distance down until I can barely start to see the light fade. [[file:acec2d65-5065-4868-8b8f-29b68c595fda.png]] Try to focus tuning down from the furthest point in the forward direction, or the direction the team is typically heading to get to the map end. Players don’t typically notice lights fading out behind them so you can sometimes be more aggressive from those viewpoints without players noticing. <B>It is not recommended to complete these steps until after baking lighting.</B> Sometimes baked lighting can make it very hard to see a light fading out and make it easier to set much lower values. ==Light Complexity== Alt + 7 or View Mode → Optimization Viewmodes → Light Complexity. [[file:f522fb6b-a26a-4376-ba5f-d796cb018615.png]] This view mode shows overlapping stationary & movable lights. Our prime concern is stationary lights. [[file:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png|none|1000px]] The hotter areas are areas with higher light complexity. The more stationary lights overlap the higher the cost, O(n2) higher. <B>UE4 does not support more than 4 overlapping stationary lights and will automatically convert the 5th light into a movable light.</B> This disables the benefit of baked lighting and will no longer generate bounced lighting when baked. The 5th light can be much more expensive too if automatically converted to movable. Typically when this happens UE4 will give you a warning, you will see a red X appear on your light, and it will also notify you after baking lights. <B>For the Anacrusis, where we have tons of dynamics enemies, we can typically only afford 3 overlapping lights to maintain a fast framerate during combat.</B> Do you best to adjust your lighting to reduce max overlapping lights. Some things you can do to reduce complexity: *Move lights or reduce their radius. *Reduce inner and outer angles (FOV) on SpotLights. *SpotLights are typically cheaper than PointLights since they broadcast at most in 90 degree FOV but PointLights cast 360 degrees. *Shadows & lights from StaticLights do not contribute to this problem and from a performance perspective they’re completely free. Typically you need to have higher resolution lightmaps near these lights or shadows may look pixelated. You can increase the light source radius to soften static shadows and hide pixelization. *StaticLights also do not directly cast onto dynamic actors and do not cast dynamic shadows. Only indirect lighting from StaticLights affect dynamic actors. So make sure to place your LightMassImportance volumes in playable areas which will generate the indirect lighting cache from static lights. *Disable Shadows on Movable & StationaryLights if possible. Sometimes it not very noticeable with other shadow casting lights nearby. ==Reduce Occluders== By default, every staticmesh & skeletalmesh in UE4 is an occluder. This means it utilizes that mesh to figure out what should be hidden if behind that mesh. This is typically used for the player camera to figure out what to hide. However occlusion is also a part of the shadow process from the lights point of view. To reduce occlusion queries even further we set “UseAsOccluder” to false on as many small props as possible. Anything that will not help occlude the world in a meaningful way. Another big reduction is to set this to false on large columns or wall braces that don’t help occlude the world. The engine uses the bounding box of these large meshes to initially figure out what objects it needs to test. Large wall braces typically don’t help and have a high cost. <B>This is often one of the highest costs and easiest way to save performance!</b> To quickly optimize occlusion you can select non occluders via Scripted Actions → Select Non Occluders. [[file:d6c33567-1d8f-473f-b4cf-1cd2529f4387.png]] This select all meshes that have already been optimized. Now press H to hide them. Now fly around the world, if you see any mesh that can have UseAsOccluder set to false select it. *You can optionally then press Shift + E (or right click->Select->Select Matching) to select all meshes of the same type. *With all of these actors selected you can then set UseAsOccluder to false all at once. For example I can select a bench in the world, shift + E to select all of the same benches, and remove them from occluders. ==Cull Distance Volumes== Cull distance volumes are used to remove objects based on their size & distance. Please see Epic’s official documentation on their use: [https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/VisibilityCulling/CullDistanceVolume/#:~:text=Cull%20Distance%20Volumes%20can%20be,for%20Size%20and%20Cull%20Distance Cull Distance Volume] We use these the same reason we optimize occluders, it reduces amount of occluding objects which impacts lighting & camera occlusion performance. Alternatively, you can copy this block of text below and paste that into your level: <code> Begin Map Begin Level Begin Actor Class=/Script/Engine.CullDistanceVolume Name=CullDistanceVolume_1 Archetype=/Script/Engine.CullDistanceVolume'/Script/Engine.Default__CullDistanceVolume' Begin Object Class=/Script/Engine.BrushComponent Name="BrushComponent0" Archetype=BrushComponent'/Script/Engine.Default__CullDistanceVolume:BrushComponent0' Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" End Object End Object Begin Object Class=/Script/UnrealEd.CubeBuilder Name="CubeBuilder_1" End Object Begin Brush Name=Model_0 End Brush Begin Object Name="BrushComponent0" Begin Object Name="BodySetup_0" AggGeom=(ConvexElems=((VertexData=((X=-100.000000,Y=100.000000,Z=-100.000000),(X=-100.000000,Y=100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=100.000000),(X=-100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=-100.000000),(X=100.000000,Y=100.000000,Z=100.000000),(X=100.000000,Y=-100.000000,Z=-100.000000),(X=100.000000,Y=-100.000000,Z=100.000000)),IndexData=(0,1,2,0,2,3,4,5,1,4,1,0,6,7,5,6,5,4,3,2,7,3,7,6,5,7,2,5,2,1,6,4,0,6,0,3),ElemBox=(Min=(X=-100.000000,Y=-100.000000,Z=-100.000000),Max=(X=100.000000,Y=100.000000,Z=100.000000),IsValid=1)))) bGenerateMirroredCollision=False CollisionTraceFlag=CTF_UseSimpleAsComplex End Object Brush=Model'"Model_0"' BrushBodySetup=BodySetup'"BodySetup_0"' End Object Begin Object Name="CubeBuilder_1" Vertices(0)=(X=-100.000000,Y=-100.000000,Z=-100.000000) Vertices(1)=(X=-100.000000,Y=-100.000000,Z=100.000000) Vertices(2)=(X=-100.000000,Y=100.000000,Z=-100.000000) Vertices(3)=(X=-100.000000,Y=100.000000,Z=100.000000) Vertices(4)=(X=100.000000,Y=-100.000000,Z=-100.000000) Vertices(5)=(X=100.000000,Y=-100.000000,Z=100.000000) Vertices(6)=(X=100.000000,Y=100.000000,Z=-100.000000) Vertices(7)=(X=100.000000,Y=100.000000,Z=100.000000) Polys(0)=(VertexIndices=(0,1,3,2),Direction=1) Polys(1)=(VertexIndices=(2,3,7,6),Direction=1) Polys(2)=(VertexIndices=(6,7,5,4),Direction=1) Polys(3)=(VertexIndices=(4,5,1,0),Direction=1) Polys(4)=(VertexIndices=(3,1,5,7),Direction=1) Polys(5)=(VertexIndices=(0,2,6,4),Direction=1) Layer="Cube" End Object CullDistances(0)=(CullDistance=1000.000000) CullDistances(1)=(Size=5.000000,CullDistance=4000.000000) CullDistances(2)=(Size=25.000000,CullDistance=5000.000000) CullDistances(3)=(Size=125.000000,CullDistance=9000.000000) CullDistances(4)=(Size=250.000000,CullDistance=15000.000000) CullDistances(5)=(Size=500.000000,CullDistance=20000.000000) CullDistances(6)=(Size=1000.000000,CullDistance=30000.000000) CullDistances(7)=(Size=2000.000000) BrushType=Brush_Add Begin Brush Name=Model_0 Begin PolyList Begin Polygon Link=0 Origin -00100.000000,-00100.000000,-00100.000000 Normal -00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,+00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=1 Origin -00100.000000,+00100.000000,-00100.000000 Normal +00000.000000,+00001.000000,+00000.000000 TextureU +00001.000000,-00000.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 End Polygon Begin Polygon Link=2 Origin +00100.000000,+00100.000000,-00100.000000 Normal +00001.000000,+00000.000000,+00000.000000 TextureU +00000.000000,-00001.000000,+00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=3 Origin +00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,-00001.000000,+00000.000000 TextureU -00001.000000,-00000.000000,-00000.000000 TextureV +00000.000000,+00000.000000,-00001.000000 Vertex +00100.000000,-00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,-00100.000000 End Polygon Begin Polygon Link=4 Origin -00100.000000,+00100.000000,+00100.000000 Normal +00000.000000,+00000.000000,+00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,+00001.000000,+00000.000000 Vertex -00100.000000,+00100.000000,+00100.000000 Vertex -00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,-00100.000000,+00100.000000 Vertex +00100.000000,+00100.000000,+00100.000000 End Polygon Begin Polygon Link=5 Origin -00100.000000,-00100.000000,-00100.000000 Normal +00000.000000,+00000.000000,-00001.000000 TextureU +00001.000000,+00000.000000,+00000.000000 TextureV +00000.000000,-00001.000000,+00000.000000 Vertex -00100.000000,-00100.000000,-00100.000000 Vertex -00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,+00100.000000,-00100.000000 Vertex +00100.000000,-00100.000000,-00100.000000 End Polygon End PolyList End Brush Brush=Model'"Model_0"' BrushBuilder=CubeBuilder'"CubeBuilder_1"' bHidden=False SpawnCollisionHandlingMethod=AlwaysSpawn ActorLabel="CullDistanceVolume" End Actor End Level Begin Surface End Surface End Map </code> This will create a cull distance volume with the settings from Episode 1. You should adjust the size & shape of the volume to overlap your entire level. 2e850405918a5a955f8e6bbe8e75481dff769c41 File:4743a7a8-6cfa-4d15-a003-10007ea60dac.png 6 168 324 2022-05-08T00:36:30Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:2c4d303f-8425-4c3e-a8a3-5dd1942e0be5.png 6 169 325 2022-05-08T00:37:05Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Bea5ef70-2e9d-4ab9-8795-fda91f64d0b7.png 6 170 326 2022-05-08T00:37:58Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:36110bfe-ee57-47db-bafd-d213c8d71779.png 6 171 327 2022-05-08T00:38:44Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:4b1ab97c-ebca-4c5c-b081-661201d60752.png 6 172 328 2022-05-08T00:39:36Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7ad90d76-6933-4af2-b7da-4b48d562c23c.png 6 173 329 2022-05-08T00:39:59Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acec2d65-5065-4868-8b8f-29b68c595fda.png 6 174 331 2022-05-08T00:40:45Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:F522fb6b-a26a-4376-ba5f-d796cb018615.png 6 175 332 2022-05-08T04:30:26Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:7870fc12-fe74-4ce3-969b-1dbbcb1e82c5.png 6 176 333 2022-05-08T04:31:14Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:D6c33567-1d8f-473f-b4cf-1cd2529f4387.png 6 177 335 2022-05-08T04:35:01Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:06516463-9cc0-4d62-af8d-1f2e20a78678.jpg 6 178 346 2022-05-08T20:24:55Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Where art assets live 0 179 347 2022-05-08T20:25:05Z Chet 3 Created page with "===Where Art Assets Live=== This document serves as a guide to where our mesh & material assets are located and where the sets are used. ==Finding existing assets== Every asset used in the Anacrusis can be accessed on the Content Browser. (Window>Content Browser). You can also access it by clicking on an existing asset in your viewport and pressing Ctrl+B to quick access where that asset is located in the folder structure. The fastest way to finding or browsing for spe..." wikitext text/x-wiki ===Where Art Assets Live=== This document serves as a guide to where our mesh & material assets are located and where the sets are used. ==Finding existing assets== Every asset used in the Anacrusis can be accessed on the Content Browser. (Window>Content Browser). You can also access it by clicking on an existing asset in your viewport and pressing Ctrl+B to quick access where that asset is located in the folder structure. The fastest way to finding or browsing for specific assets is by searching for it inside the Content Browser. [file:06516463-9cc0-4d62-af8d-1f2e20a78678.jpg] 841876eb274c41c102c571cd3acd62361fffa4f8 File:4e02cd56-42e3-46c2-986e-598a737a75f3.jpg 6 180 348 2022-05-08T20:26:15Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:3b86eb64-2a50-4820-a2ba-db6dbb14fcfb.jpg 6 181 349 2022-05-08T20:27:14Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A0210cd9-a77f-4b6b-93e5-4b93109f74ee.jpg 6 182 350 2022-05-08T20:27:51Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:A87e2cf0-d859-462b-b3ee-38c66dc492b5.jpg 6 183 351 2022-05-08T20:29:10Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:8926ce5d-6573-4945-b4ce-04eda44d46de.jpg 6 184 352 2022-05-08T20:34:36Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:80ccae33-08f7-4e80-96e1-adf98c6c9e21.jpg 6 185 353 2022-05-08T20:35:21Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Where art assets live 0 179 354 347 2022-05-08T20:36:13Z Chet 3 wikitext text/x-wiki ===Where Art Assets Live=== This document serves as a guide to where our mesh & material assets are located and where the sets are used. ==Finding existing assets== Every asset used in the Anacrusis can be accessed on the Content Browser. (Window>Content Browser). You can also access it by clicking on an existing asset in your viewport and pressing Ctrl+B to quick access where that asset is located in the folder structure. The fastest way to finding or browsing for specific assets is by searching for it inside the Content Browser. [[file:06516463-9cc0-4d62-af8d-1f2e20a78678.jpg]] <B>Tip:<B> Searching is much easier if you use filters to look for specific asset types: such as static meshes for static mesh actors, skeletal meshes for moveable actors, blueprints, material instances etc. Every art asset created for the maps in the Anacrusis is located inside the Content/Environment subfolder group: Content/Characters/Player/ - All assets related to the Player Characters Content/Characters/NPC/ - All assets related to the Alien enemies Content/Weapons/ - All assets related to Weapons Content/Gameplay/ - Other assets like the health scanners etc Content/Environment/ISO/Meshes - Contains the vast majority of static meshes used in the Isolode ship, separated by location or, if not tied to a specific location in the game, type. This includes wall, floor, ceiling and column pieces as well as debris and props. Below is a non-exhaustive list of map-related art asset location structure. [[file:4e02cd56-42e3-46c2-986e-598a737a75f3.jpg]] ==Changing Materials== Content/Environment/ISO/Materials - Contains every instance and master materials used in game Content/Environment/ISO/Textures - Contains textures referenced in the above materials An example of different materials with the same static mesh actors. [[file:3b86eb64-2a50-4820-a2ba-db6dbb14fcfb.jpg|none|1000px]] [[file:a0210cd9-a77f-4b6b-93e5-4b93109f74ee.jpg|none|1000px]] Each static mesh has an associated material and, in some cases, multiple variants of that same material. By swapping materials you can get very different looks, so feel free to experiment! An example of the same room, same actors, different materials. [[file:a87e2cf0-d859-462b-b3ee-38c66dc492b5.jpg|none|1000px]] ==Adding Decals== Content/Environment/Materials/Master/Decal - Contains Decal actor assets Decal actors give even more visual variety to spaces with very little cost. Example map with no decal actors [[file:8926ce5d-6573-4945-b4ce-04eda44d46de.jpg|none|1000px]] Example map with decal actors [[file:80ccae33-08f7-4e80-96e1-adf98c6c9e21.jpg|none|1000px]] ==Understanding Asset Names== They typically follow this pattern: (Ship)(Location)(ObjectName)_A(Mesh Variant)2(Material Variant) So, an example: ISO_Mall_InnerWallA_Crnr and ISO_Mall_InnerWallA_End - belong to the same set of static meshes and can be snapped together Just as: ISO_Plastic_Metal_RedCarpet and ISO_Plastic_Metal_Yellow are different color variants of the same material. e6f94ccf5b1cd8d8cb86a3083524cb2911b89064 355 354 2022-05-08T20:36:59Z Chet 3 wikitext text/x-wiki ===Where Art Assets Live=== This document serves as a guide to where our mesh & material assets are located and where the sets are used. ==Finding existing assets== Every asset used in the Anacrusis can be accessed on the Content Browser. (Window>Content Browser). You can also access it by clicking on an existing asset in your viewport and pressing Ctrl+B to quick access where that asset is located in the folder structure. The fastest way to finding or browsing for specific assets is by searching for it inside the Content Browser. [[file:06516463-9cc0-4d62-af8d-1f2e20a78678.jpg]] <B>Tip:</B> Searching is much easier if you use filters to look for specific asset types: such as static meshes for static mesh actors, skeletal meshes for moveable actors, blueprints, material instances etc. Every art asset created for the maps in the Anacrusis is located inside the Content/Environment subfolder group: Content/Characters/Player/ - All assets related to the Player Characters Content/Characters/NPC/ - All assets related to the Alien enemies Content/Weapons/ - All assets related to Weapons Content/Gameplay/ - Other assets like the health scanners etc Content/Environment/ISO/Meshes - Contains the vast majority of static meshes used in the Isolode ship, separated by location or, if not tied to a specific location in the game, type. This includes wall, floor, ceiling and column pieces as well as debris and props. Below is a non-exhaustive list of map-related art asset location structure. [[file:4e02cd56-42e3-46c2-986e-598a737a75f3.jpg]] ==Changing Materials== Content/Environment/ISO/Materials - Contains every instance and master materials used in game Content/Environment/ISO/Textures - Contains textures referenced in the above materials An example of different materials with the same static mesh actors. [[file:3b86eb64-2a50-4820-a2ba-db6dbb14fcfb.jpg|none|1000px]] [[file:a0210cd9-a77f-4b6b-93e5-4b93109f74ee.jpg|none|1000px]] Each static mesh has an associated material and, in some cases, multiple variants of that same material. By swapping materials you can get very different looks, so feel free to experiment! An example of the same room, same actors, different materials. [[file:a87e2cf0-d859-462b-b3ee-38c66dc492b5.jpg|none|1000px]] ==Adding Decals== Content/Environment/Materials/Master/Decal - Contains Decal actor assets Decal actors give even more visual variety to spaces with very little cost. Example map with no decal actors [[file:8926ce5d-6573-4945-b4ce-04eda44d46de.jpg|none|1000px]] Example map with decal actors [[file:80ccae33-08f7-4e80-96e1-adf98c6c9e21.jpg|none|1000px]] ==Understanding Asset Names== They typically follow this pattern: (Ship)(Location)(ObjectName)_A(Mesh Variant)2(Material Variant) So, an example: ISO_Mall_InnerWallA_Crnr and ISO_Mall_InnerWallA_End - belong to the same set of static meshes and can be snapped together Just as: ISO_Plastic_Metal_RedCarpet and ISO_Plastic_Metal_Yellow are different color variants of the same material. f78a192674ad8257ab659ba7f1ebdffde47b1fad File:1312312321312321ffsfCapture.PNG 6 186 356 2022-05-14T00:38:44Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Installing the Mod Kit 0 50 357 289 2022-05-14T00:39:29Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info Once you close that window, make sure to save. If you see a plus symbol on any asset in the editor, that means that asset needs to be saved. You can save it by clicking on it and then hitting cntrl-S. [[file:1312312321312321ffsfCapture.PNG]] [[file:ModInfo.png]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. 4fc28ac3032f1573052eab38b78b14c05cf7ad36 358 357 2022-05-14T00:40:02Z Chet 3 wikitext text/x-wiki ==Setting up the Mod== First you will want to install the download package by unpacking it into an empty directory. Yes it is big! Make sure you have the room. After it installed, click on RunEditor.bat to launch the editor. The first time you do this it will take a little bit longer. As the editor launches you might see the following messages. You will want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] That will open a popup asking you for your mod name. This will be the internal name of the mod, not the mod's name itself. Ideally you don't want to put spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] Once you close that window, make sure to save. If you see a plus symbol on any asset in the editor, that means that asset needs to be saved. You can save it by clicking on it and then hitting cntrl-S. [[file:1312312321312321ffsfCapture.PNG]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. 078de7f8f2328c77371e0ba22fda1fa1ae2ce95d 369 358 2022-06-21T09:24:42Z Mars 6 Increasing fluency, correcting spelling errors, and updating outdated information wikitext text/x-wiki ==Setting up the Mod== First, download the Conchiglie Editor package from the Epic Games launcher; it takes up over 200 GB of space, so make sure you have enough space. After installing it, you can launch the editor via the Epic Games library. The first time you do this, it will take a little longer. As the editor launches you might see the following messages. You'll want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. [[file:1312312321312321ffsfCapture.PNG]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. ee593f52d7529529f01638e239ee62e3d831b930 File:Cap132132132132333ture.PNG 6 187 359 2022-05-14T01:04:01Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Making A Map 0 3 360 291 2022-05-14T01:04:22Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 7c90affa2b78f3f254bc1857445a30747424a523 362 360 2022-05-14T17:29:47Z Chet 3 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] If you lose your original directory in all the folders, you can find it at the bottom on its own in the drop down list. [[file:AsdasdasdddsadsadsadCapture.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap a0aed03a53fab78335fdd7ccc79e79d978708453 363 362 2022-05-22T03:39:56Z Chet 3 /* Placing the airlock geometry */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] If you lose your original directory in all the folders, you can find it at the bottom on its own in the drop down list. [[file:AsdasdasdddsadsadsadCapture.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: (if this is not in your UI, you can go to Window -> Levels and then add it to the UI - we suggest dragging it to where pictured. [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the LevelStreamer actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 6e941537fd70dd6b268d2a756cd61416d31a0688 364 363 2022-05-22T04:02:44Z Chet 3 /* Setting Navigation */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] If you lose your original directory in all the folders, you can find it at the bottom on its own in the drop down list. [[file:AsdasdasdddsadsadsadCapture.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: (if this is not in your UI, you can go to Window -> Levels and then add it to the UI - we suggest dragging it to where pictured. [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the "SBLevel Streaming Actor" actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map and it will "disappear" as it won't need a location, but it will live on the map and in your dreams. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 0fefe92f1d5219c972d7aba0423bb0c9c845d9de 365 364 2022-05-24T19:44:27Z StrayDanger 5 wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. Every map in Anacrusis starts and ends in a [[Safety Airlock]] with the exception of a few special spots, like episode finales. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] If you lose your original directory in all the folders, you can find it at the bottom on its own in the drop down list. [[file:AsdasdasdddsadsadsadCapture.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: (if this is not in your UI, you can go to Window -> Levels and then add it to the UI - we suggest dragging it to where pictured. [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -50 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the "SBLevel Streaming Actor" actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map and it will "disappear" as it won't need a location, but it will live on the map and in your dreams. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. To get your fellow survivors shooting you need an AICoordinatorWorldInfo in your map, you can create your own or use one of the defaults found in Environment/Gameplay/AICoordinatorInfo You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap a1990b92a33df6f6934e8c061463207f725a1061 370 365 2022-06-25T05:06:35Z Mars 6 /* Creating your first Map */ wikitext text/x-wiki ==Creating your first Map== This is a quick intro on everything you need to make a map in Anacrusis. This tutorial assumes you have basic knowledge in [https://www.unrealengine.com/ Unreal Engine (UE4)] and level design. For more information on level design & working in UE4 see [https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/ Epic’s documentation.] The first step is [[Installing the Mod Kit]] and now we can start making maps. In the Anacrusis, every map begins and ends in a [[Safety Airlock]], with the exception of a few special locations, such as episode finales and the Holdout levels. So lets start by setting up the airlock. ===Creating your Level File=== First you need to create your base map file. To do this go to the content browser and navigate to the maps directory from the previous tutorial. For this example we are going to put our map directory in the Maps folder. Go into that directory and right click and choose to create "New Level" and name that MyTest. [[file:Firstlevel.PNG]] Double click on the map file and it will open it up to an all black screen in the view port. Don't worry, that's normal - let's put something there! ===Placing the airlock geometry=== Each episode in the Anacrusis begins and ends with a Safety Airlock. Let's place the starting airlock geometry in your level. While all of the content we are shipping with our custom map has to live in our directories, we do have access to the base game content as well. You can find this content by navigating back in the directory structure of the content browser to All Assets and then searching from there. Even though this content is not in your mod directories, it will still be included since it is in the base game. To access this content, you can navigate to the blueprint under Blueprint'/Game/Maps/Station_1/ISO_Airlock_Start_BP'. You can just also just type "ISO_airlock_start_BP" in the content browser search and it will show up. If it doesn't make sure to move up a few levels in the directory controls at the top of the search window. [[file:Firstmap setup addingairlock.PNG]] If you lose your original directory in all the folders, you can find it at the bottom on its own in the drop down list. [[file:AsdasdasdddsadsadsadCapture.PNG]] Just left click on the file and drag it into your main view port - the big black window and let go. It will drop into your level file. Now move that to 0,0,0 in the world space. You can do that by going into details on the right and putting 0,0,0 in the location X,Y,Z. [[file:Centeringfirstairlock.PNG]] Now we need to play the place the airlock weapons & items. Repeat the above process with the blueprint that contains this data. Blueprint'/Game/Maps/Station_1/Airlock_Items_Episode_Start' These two objects should be laid over each other so move this to 0,0,0 in the location X,Y,Z as well. You should now see an airlock with weapons but no doors. Note: Episode_Start is used for a map that starts an episode. Airlock_Items_Mid_Start is for every starting airlock after the first map. The Episode_Start items contains a non-working med station. Next import the airlock gameplay actors by clicking “Add Existing…” from the level browser: (if this is not in your UI, you can go to Window -> Levels and then add it to the UI - we suggest dragging it to where pictured. [[file:Firstmap levels addexisting.PNG]] Browse to and select /Maps/Station_1/Transition_Airlock. This map contains all the gameplay actors needed to operate the starting airlock. This map file will also automatically be brought in at 0,0,0 and it will create a new level called Transition_Airlock (Ready Only). Right click on this sublevel and change the streaming method to Always be Loaded. If this prompts you to save or connect to source control - you can ignore this. [[file:TutorialChangeStreaming.PNG]] You will not want to overwrite the data in this sublevel but we should always be saving. So double click on the persistent level to make sure that is the space you are working in and hit Crtl-S to save. Let’s stub in some geometry to temporarily represent our “map.” So Let's grab a cube from the left and toss it into our map. We can play with the scale to make it a little bit bigger, so let's change the X and Y scale values to 100. We can leave the z the same. Move the cube so it is just under the door - the Z height should be -51 to since the door is at zero and cube itself has a thickness. [[file:Cap132132132132333ture.PNG|None|1000px]] Let's add some temporary light! From the Place Actors menu on the left, type in "directional light" and drag it onto the scene. This can be located anywhere and we will just use the defaults. Now is the time to setup the exit airlock so you can complete the map! This is done very similar to the starting airlock. Type "ISO_Airlock_End_BP" in the content browser search bar and it will show up. Grab this and drag it on the cube so it matches the height and drag it to an edge of the map. Now repeat the same process with "Airlock_Items_End". To make sure it exactly overlaps, right click on the ISO_Airlock_End_BP's location and choose copy. Now select the Airlock_Items_End and right click on the location and choose paste. They will line up! [[file:Tutorial01_Copy.PNG]] Next import the ending airlock gameplay actors by clicking “Add Existing…” from the level browser then selecting Maps/Station_1/Transition_Airlock_End. Set the Transition_Airlock_End sublevel to Always Loaded in the Level Browser. Remember what we said about adding an existing level? It will place it at 0,0,0. So we need to move this level to line up with the ISO_Airlock_End_BP. To do this, right click on the ISO_Airlock_End_BP location and chose copy. Open the level details window from the level by making sure Transition_Airlock_End is selected and hitting the Summon level detail button. This is a very easy button to miss. [[file:Tutorial01_Summon.PNG]] This will bring up a popup with location details. Right click on the location and paste the ISO_Airlock_End_BP information there and then close the popup - it will automatically save that data. All of your sublevels and saferoom content should now line up. That's the base for all levels. A starting and ending airlock with some content to move through. Make sure to click on persistent level and save often. Do that and hit play in the menu bar, you should be able to successfully start and navigate to the end airlock and complete the level! (warning, the first time you run a level it will pause for an extremely long time! If the game instantly brings up the fail screen, you didn't set the streaming of the starting airlock to Always Loaded. But what about the enemies? Let's get them setup. First step there is setting up navigation. ===Setting Navigation=== *Next place a NavMeshBoundsVolume over the entire playable map, including the airlocks. To do this type NavMeshBoundsVolume in the Place Actor search and drag Nav Mesh Bounds Volume onto your map (make sure you have the persistent level selected) and stretch it over over the complete map and airlocks. (In the future when you have a blocked out map you’ll want to have multiple of these volumes setup to cover all the playable space enemies & players can go and try to limit it covering areas they cannot go.) Press P and you should see your map covered in green. [[file:GreenNavigation.PNG|none|1000px]] Lets drop down one more element now. Find the "SBLevel Streaming Actor" actor and drop it down anywhere on the map. It does not need to be stretched or resized, just dropped on the map and it will "disappear" as it won't need a location, but it will live on the map and in your dreams. ===Setup the Director=== The Director controls all of the spawning of enemies, weapons, and items in the game. To help the Director we need to let it know where the map starts and ends. To do this the driver builds a gradient or tile map of the world utilizing the level geometry and navmesh. We call this the context. Each tile is assigned a score based on how close they are to the goal. Various other bits of data are put into these tiles to assist with spawning but we’ll cover that in a bit. Let’s get started! First let’s create a new sublevel to place the driver related actors. In the level browser select the level drop down and select new: Choose empty level and let's name it MyTest_Context and save it in the same directory as your MyTest map. This may show you all of the content directory so make sure to navigate to your mod's root directory and then the directory you have your maps. The context can get large so placing it in its own sublevel helps with save times. It also helps when working with a team so you can work at the same time. Don’t forget to switch back to this sublevel when adding new actors in the future! Set this new sub level to Always Loaded from the level browser. Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextBP' near the map exit, just before the airlock exit door. This is the map goal: Now place Blueprint'/Game/AI/Driver/LevelMapData/LevelContextMapper' anywhere in the level. I place these near the map start for convenience. The mapper is used to change how the context compiles the world, for now let’s leave this as is. Next we place Blueprint'/Game/AI/Driver/Driver_Blueprints/Buddies/StartBuddy' near the map start, just outside the airlock door. This tells the driver where our map begins: Make sure Start buddy is touching the ground. In the StartBuddy details set the Level Context Obj in the drop down - you should see the one you have placed in the map. [[file:StartBuddy.PNG]] Select the LevelContextBP actor (the one you placed by the end of the map) and assign the “Start Buddy” property to the new StartBuddy you just placed. Select SBTools in the menu bar then select Level Context Mapper Shortcuts->Map Everything: If you see the dreaded red squares of failure - make sure your Start Buddy and all of the other elements are touching the map and that you have connected the start and the end as described above. This compiles the gradient score as well as vis data which tells every tile what other tiles are in view. To visualize this select SBTools->Level Contexts->Draw All Golden Paths The golden path is roughly the quickest path from the map start to the map end. In this case its very simple but in maps of various shape this helps to inform what's the main path versus side paths. [[file:GoldenPath.PNG|none|1000px]] If you see a Golden Path make sure to click into the persistent level and save and then also go into the Content Browser and right click and choose save on the context file - MyTest_Context If you press Alt + P to play you should now have enemies & items spawning in your map. To get your fellow survivors shooting you need an AICoordinatorWorldInfo in your map, you can create your own or use one of the defaults found in Environment/Gameplay/AICoordinatorInfo You’ve got a working Anacrusis level! As you work on your level anytime you make changes that modify the navmesh or impacts what’s in view you will need to recompile the context for the best results. Make sure to save all or at least the context and the main map. A map containing all the setup described in this tutorial is located here: Content/Maps/Test/Campaign_Level_Start.umap 02e4b58904801921b5a58b89c6ea9abf4c04ea21 File:AsdasdasdddsadsadsadCapture.PNG 6 188 361 2022-05-14T17:28:53Z Chet 3 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Holdout Quickstart Guide 0 9 366 86 2022-06-09T20:16:54Z StrayDanger 5 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, let's make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 2 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 PlayerStartHoldout placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map To replicate the behavior for ModKit add a PlayerStart and add “HoldoutPlayerStart” under the actor tags {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:HoldoutPlayerStart.png]] |} ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |- | LootBox_HoldoutNades Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains nades items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Require Activation || Does this MC require a reactivation via capture zones? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart.png]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. de97502cb1e4da091b48a830b4d0a6a890d6d268 367 366 2022-06-09T20:18:02Z StrayDanger 5 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, let's make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 2 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “CurrentWave”, ideally waves 1-3 should be between 1-1.5 on the y axis. ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | DelayScale || How long it takes for threat to increase, the treat scale starts at 0 and every x it will add 0.1 till reaching 1 |- | DelaySpawnWave || how long it takes for another batch of specials to spawn |- | DelaySpawnHorde ||how long it takes for another horde to spawn |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Horde Config |- ! Variable !! Info |- | SwarmSize || how big the horde swarm is |- | SpawnRate || how many should spawn per second |} Holdout is endless and with endless we don't want to just randomly throw everything all of the time, so you can dictate the waves. So each wave is selected at random from Waves except for every 3rd wave where we pick a special wave from the “Special Waves” bucket rather than “Waves” {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Config |- ! Variable !! Info |- | GameplayTags || You can apply any gametag to the GameSession’s Tag Comp, like if you wanted Floopers to spawn that wave you could add ActorType.Enemy.Elite.GooShooter.Fire |- | MaxSpecials || If Zero it will count howmany requested groups, if you want no specials for a wave set this to zero and don't declare any groups. |- | RequestedGroups || A list of what kind of specials we want to spawn during the wave. See groups table below for Available Groups |- | ThreatGoal || how much should the base threat be for this wave, Idealy this should 30-40, this will be multiplied by our DifficultyCurve over time |} <b>Available Groups</b> Grabber Brute Grooper Flasher Spawner ==Setting up spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 HoldoutPlayerStart placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Adding Matter Compilers== {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:MatterCompilers.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | LootBox_HoldoutPerks Blueprint Class || Environment/Gameplay/Pickups/LootBoxes || Contains Perks |- | LootBox_HoldoutWeapons Blueprint Class|| Environment/Gameplay/Pickups/LootBoxes || Contains Special weapons and grenades |- | LootBox_HoldoutHealth Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains health items |- | LootBox_HoldoutNades Blueprint Class ||Environment/Gameplay/Pickups/LootBoxes || Contains nades items |} Drag any of the above entities into your map, for them to work fully you will need a Trigger_HoldoutLootManager. Once Spawned link your spawn matter compilers to the manager {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutLootManager.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Manager |- ! Variable !! Info |- | Lootboxes || Connected MCs |- | Require Activation || Does this MC require a reactivation via capture zones? |- | Wave Mod || What the modulus of the wave should be for activation. zero would disable, if at mod 2 we will enable the connected MCs every 2 waves |} To replicate the behavior for ModKit use Trigger_HoldoutEvent and have it's ListenEvent set to OnWaveStart or OnWaveMid ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart.png]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. 0535134ac09cedf117c6b4e4f5a34b2dea0bf01f 395 367 2022-09-26T22:16:28Z StrayDanger 5 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, let's make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 2 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “time” 0-1 over the duration of the core event ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | Min Spawn Locations By Time|| |- | Max Spawn Locations By Time|| |- | Percent Threat From Waves || |- | Event Duration || |- | Event Wave Count|| |- | Countdown To Event Start || how long after pressing the button the vent should really start |- | Initial Common Swarm || How many commons are in the initial swarm of common after starting the holdout |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Capture Config |- ! Variable !! Info |- | Reward Time Min || the minimum time in seconds that it should take for the event to "activate" post downtime |- | Reward Time Max || the maximum time in seconds that it should take for the event to "activate" post downtime |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Downtime Config |- ! Variable !! Info |- | DownTime Length || how long post capture downtime should last |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Boss Config |- ! Variable !! Info |- | Required Captures || how many captures are required for the boss to spawn |} It is recommended you have a decent understanding of how special events work, you can read more here ([[Holdouts & Activation Systems]]). Holdout acts as a highly controlled "special event" ==Setting up enemy spawns== Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] to set the spawn pos for the boss you need to place info_boss_spawn someplace out of sight. [[file:boss_spawn.png]] ==Setting up player spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 HoldoutPlayerStart placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Setting Up Music== tbd ==Setting Up Capture Zones aka "Uplinks"== tbd ==Setting up rewards== Place a info_holdout_lootbox some place in your level, that's where the reward mc will spawn. [[file:info_holdout_lootbox.png]] ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart.png]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. a94168aa44efd92154f436769f347364b1db2da8 399 395 2022-09-26T22:34:05Z StrayDanger 5 wikitext text/x-wiki This is a quick start guide to building a holdout map. This guide is going to cover holdout-specific entities/stuff and assumes you know things about the <link to entity io docs>(entity activation) Let’s get going! First, let's cover some of the basics, first, you need a map setup with the director see [[Making A Map]]. ===The Underlying Data=== First, let's make a copy of s1c15’s holdout metadata found in (/Game/Gameplay/Gamemodes/Holdout/Ep1/') In Holdout, we have 2 key data assets responsible for how the driver reacts during our session in holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Meta Data |- | [[file:DifficultyCurve.png]] |} ==DifficultyCurve== A curve data asset that dictates the “Difficulty Multiplier”. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Difficulty Curve |- | [[file:DifficultyCurve2.png]] |} The x-axis in our case is “time” 0-1 over the duration of the core event ==WaveOutline== The WaveOutline is the core of how it really plays on each map, here we can dictate almost everything about how each wave is handed to us. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Wave Outline |- | [[file:WaveOutline.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Event Config |- ! Variable !! Info |- | Min Spawn Locations By Time|| |- | Max Spawn Locations By Time|| |- | Percent Threat From Waves || |- | Event Duration || |- | Event Wave Count|| |- | Countdown To Event Start || how long after pressing the button the vent should really start |- | Initial Common Swarm || How many commons are in the initial swarm of common after starting the holdout |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Capture Config |- ! Variable !! Info |- | Reward Time Min || the minimum time in seconds that it should take for the event to "activate" post downtime |- | Reward Time Max || the maximum time in seconds that it should take for the event to "activate" post downtime |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Downtime Config |- ! Variable !! Info |- | DownTime Length || how long post capture downtime should last |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Boss Config |- ! Variable !! Info |- | Required Captures || how many captures are required for the boss to spawn |} It is recommended you have a decent understanding of how special events work, you can read more here ([[Holdouts & Activation Systems]]). Holdout acts as a highly controlled "special event" ==Setting up enemy spawns== Now we need to setup the spawn locations for the enemies. To do this start by placing one Blueprint'/Game/AI/Driver/Driver_Blueprints/SpecEventSpawnerBP' #Remember these should be placed out of sight in an area players can’t get to. [[file:1b56f557-b38a-4f38-b659-2dfe157ff0ad.png|none|1000px]] to set the spawn pos for the boss you need to place info_boss_spawn someplace out of sight. [[file:boss_spawn.png]] ==Setting up player spawns== Holdout does spawning differently, we don't need a start or end airlock, we just need 4 HoldoutPlayerStart placed around the map. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Spawns |- | [[file:SettingUpSpawns.png]] |} You will want to place your start buddy here too, unless you are converting an existing map ==Weapons and Ammo== Each holdout map should contain some or all of these. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Guns and Ammo Spawns |- | [[file:GunsAndAmmo.png]] |} {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Weapon/Matter Compiler Entities |- ! Entity !! Path !! Info |- | AllAmmoPickup Blueprint Class || Environment/Gameplay/Pickups/ || The standard charger |- | GunDispenser01 Blueprint Class|| Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with Blaster & Plasma Rifle |- | GunDispenser02 Blueprint Class ||Environment/Gameplay/Pickups/Holdout/ || A Gun Dispenser with SMB & Plasma Rifle |} ==Setting Data== Before we get this holdout train rolling we need to first set the holdout DifficultyCurve, WaveTime, DowntimeCurve, WaveOutline. First Create a Trigger_BeginPlay and Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_BeginPlay.png]] |} Link Trigger_BeginPlay to Trigger_SetHoldoutData {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData.png]] |} Then over on our Trigger_SetHoldoutData setup the holdout config, {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_SetHoldoutData2.png]] |} you can use any existing holdout configs for official holdout modes shipped with the modkit found in Gameplay/Gamemodes/Holdout or you can create your own using the reference at the start ==Setting Up Music== place a info_holdout_music near where you want players to go, ideally, this should be near the "start holdout button". place a Volume_HoldoutMusicTrigger this will transition the music from intro to idle, I delay this should be in the immediate path of the player. ==Setting Up Capture Zones aka "Uplinks"== Place and spawn a few CaptureStation_Holdout around your level. ==Setting up the entity logic.== You need 2x Trigger_Holdout(s), 2x Trigger_ActiveRandomCapture, 1x Trigger_CaptureLoot [[file:logic_tree.png]] Trigger_Holdout (Trigger_HoldoutWaveStart) #Target: Trigger_SelectRandomStation #Event: OnCaptureEventStarted Trigger_ActiveRandomCapture (Trigger_SelectRandomStation) #ResetAll: false #Target: Trigger_CaptureLoot Trigger_CaptureLoot (Trigger_CaptureLoot) Trigger_Holdout (Trigger_HoldoutWaveEnd) #Target: Trigger_ResetAllCaptures #Event: OnCaptureEventEnded Trigger_ActiveRandomCapture (Trigger_ResetAllCaptures) #ResetAll: True #Target: nothing ==Setting up rewards== Place a info_holdout_lootbox some place in your level, that's where the reward mc will spawn. [[file:info_holdout_lootbox.png]] To setup a perk box that unlocks each capture Place a lootbox_holdoutperks & trigger_holdoutlootmanager. [[file:perk_lootbox.png]] On the loot manager, link the newly spawned perkbox and select require activation [[file:lootmanager_details.png]] ==Starting A Holdout Round== To start hold we need to create Trigger_HoldoutModeStart and link it to some activatable input. I like to use Panel_RequireAllPlayers. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Panel_RequireAllPlayers.png]] |} First create a Panel_RequireAllPlayers and place it, and link it to your Trigger_HoldoutModeStart., {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_HoldoutModeStart.png]] |} Now create a “Volume” this can be found in Environment/Gameplay/Volumes, size it however you want {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:StartVolumes.png]] |} And you will need to link this to your panel and enable “RequireAllPlayersToActivate” so it enables once all players are in the range {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:RequireAllPlayersToActivate.png]] |} ==Converting an existing map== It’s not as hard as you would think, An example of a multi-gametype map can be found in Maps/Station_1/Campaign_1/Level_5/s1c1l5_bridge. Trigger_Branch is your friend, if you want to add holdout only logic to the trigger of your finally create two Trigger_Branches one tagged as Campaign and one Tagged as Holdout {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:Trigger_Branch.png]] |} Move your normal activations list to the Campaign Trigger_Branch, then have your normal panel/activation method call the branch triggers {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ |- | [[file:TriggerBranch1.png]] |} One “advanced” helpful entity is Trigger_DestroyTargetByTag when combined with Trigger_Auto → Trigger_Branch you can create a setup that allows for unique map-specific entities. In official maps, we use CampaignOnly and HoldoutOnly Actor Tags on entities to mark them. 331a3b66dbaac79bcd7109396b571abe687e8139 File:UnlitLighting.png 6 189 368 2022-06-15T10:42:08Z Mars 6 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Package mod.png 6 190 371 2022-09-26T20:44:20Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Cooking.png 6 191 372 2022-09-26T20:49:34Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Addons folder.png 6 192 373 2022-09-26T20:53:09Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:New addon ws.png 6 193 374 2022-09-26T20:57:33Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Select folder ws.png 6 194 375 2022-09-26T20:59:01Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Edit tags ws.png 6 195 376 2022-09-26T21:02:14Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 377 376 2022-09-26T21:03:33Z StrayDanger 5 StrayDanger uploaded a new version of [[File:Edit tags ws.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Update ws.png 6 196 378 2022-09-26T21:06:51Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Main Page 0 1 380 345 2022-09-26T21:08:59Z StrayDanger 5 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) == Making a Gun Charm == #[[tbd]] == Making a Survivor Skin == #[[tbd]] == Making a Head Accessory == #[[tbd]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 53393156b0f9352d05a56e7ef8afeb8c04ddd360 382 380 2022-09-26T21:13:04Z StrayDanger 5 /* Making a Map */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Making a Gun Charm == #[[tbd]] == Making a Survivor Skin == #[[tbd]] == Making a Head Accessory == #[[tbd]] == Additional Pages == [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 05b5e3c33e3f71c9636d0732e8c0441ac2598413 383 382 2022-09-26T21:14:58Z StrayDanger 5 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Progress Meters]] [[Jump Pads]] 514da01c10080a7cfe894242c51460920d856a3a Setting up a Scenario 0 198 384 2022-09-26T21:33:38Z StrayDanger 5 Created page with "==Creating the Scenario== First, create a new Scenario data asset in your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Scenario Data |- ! Variable !! Info |- | ScenarioID|| Identifier used to select the scenario via party attributes during matchmaking |- | Display Name || Player-facing name |- | Subtitle || Player-facing subtitle |- | Description|| Player-facing description |- | Objective || Objective string (shown in game) |- | Descript..." wikitext text/x-wiki ==Creating the Scenario== First, create a new Scenario data asset in your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Scenario Data |- ! Variable !! Info |- | ScenarioID|| Identifier used to select the scenario via party attributes during matchmaking |- | Display Name || Player-facing name |- | Subtitle || Player-facing subtitle |- | Description|| Player-facing description |- | Objective || Objective string (shown in game) |- | Description|| Player-facing description |- | PreviewImage || Player-facing preview image |- | Personas || Personas available for this scenario |- | Maps|| Maps played through in this scenario |- | Gamerules|| Gamerules for this scenario |} Personas does not have a default value but is required, copy and past this code block over "Personas" <code> ("Guion","Nessa","Liu","Lance") </code> If you want to enable difficulty selection, copy and past this code block over "Features" <code> ((FeatureType=Difficulty,FeatureName="Difficulty",FeatureLabel=NSLOCTEXT("[A9021DB4412ABD87545C5385A408B8EA]", "886040464501ADFC6ED12B894C72E861", "Difficulty"),Settings=((SettingLabel=NSLOCTEXT("[A9021DB4412ABD87545C5385A408B8EA]", "73DB0D864C055A6E6DDF91A57692FD10", "Normal"),GameStateModifierGameplayTags=(GameplayTags=((TagName="Modifier.Driver.Intensity.Normal")))),(SettingLabel=NSLOCTEXT("[A9021DB4412ABD87545C5385A408B8EA]", "BF916B1D4EBF6A9EFB68B5832604FA80", "Intense"),GameStateModifierGameplayTags=(GameplayTags=((TagName="Modifier.Driver.Intensity.High"))))))) </code> == Map List == Add the maps in order that they are meant to be played. e.g for ep1 we have this map list #s1c1l1_terminal #s1c1l2_crew #s1c1l3_mall #s1c1l4_park #s1c1l5_bridge == Game Rules == Game Rules are objects that can modify/overwrite existing game features. you can make your own game rules in blueprint or use existing ones, like SBHoldoutGameRulesBP 0503c9ef8f1d748baf84e77613ee9e9ada21baa7 Gun Charm Quickstart Guide 0 199 385 2022-09-26T21:39:01Z StrayDanger 5 Created page with "First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomCharm data asset. Give it a name, mesh, and icon Example Charm: <link to ModSupport_CharmBase.zip> then you should be good to get started [[Packaging_your_addon]]" wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomCharm data asset. Give it a name, mesh, and icon Example Charm: <link to ModSupport_CharmBase.zip> then you should be good to get started [[Packaging_your_addon]] 78b371080490ce723ea67719fa1e0765d0bd3301 402 385 2022-10-14T20:51:04Z StrayDanger 5 wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomCharm data asset. Give it a name, mesh, and icon Examples can be found in Win\Tools\Examples then you should be good to get started [[Packaging_your_addon]] 3d1ffefee2d33bc22da834feaf6d7fdfc2db2b66 Head Accessory Quickstart Guide 0 200 386 2022-09-26T21:40:59Z StrayDanger 5 Created page with "First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomAccessory data asset. Give it a name, mesh, and icon. Accessories don't need to fit every survivor, you can select what survivors can use this accessory by selecting them in "personas" Example Accessory: <link to ModSupport_AccessoryBase.zip> then you should be good to get started [[Packaging_your_addon]]" wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomAccessory data asset. Give it a name, mesh, and icon. Accessories don't need to fit every survivor, you can select what survivors can use this accessory by selecting them in "personas" Example Accessory: <link to ModSupport_AccessoryBase.zip> then you should be good to get started [[Packaging_your_addon]] a3c093aca53c026e1622c7b1981528df193fefa7 401 386 2022-10-14T20:50:37Z StrayDanger 5 wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomAccessory data asset. Give it a name, mesh, and icon. Accessories don't need to fit every survivor, you can select what survivors can use this accessory by selecting them in "personas" Example can be found in Win\Tools\Examples then you should be good to get started [[Packaging_your_addon]] f2e6d0fc0318924542e21098541bf4ebbc819f3e File:Select survivor.png 6 201 387 2022-09-26T21:42:49Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Survivorasset.png 6 202 388 2022-09-26T21:52:02Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Survivor Skin Quickstart Guide 0 203 389 2022-09-26T21:52:35Z StrayDanger 5 Created page with "First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomSurvivorSkin data asset. Select what survivor this skin targets. [[file:select_survivor.png]] Give it a name and icon. Next create a SurvivorSkinAssets data asset. [[file:survivorasset.png]] This is where you will define the first/third person meshes and materials for your skin. Example Accessory: <link to ModSupport_CharacterBase.zip> then you should b..." wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomSurvivorSkin data asset. Select what survivor this skin targets. [[file:select_survivor.png]] Give it a name and icon. Next create a SurvivorSkinAssets data asset. [[file:survivorasset.png]] This is where you will define the first/third person meshes and materials for your skin. Example Accessory: <link to ModSupport_CharacterBase.zip> then you should be good to get started [[Packaging_your_addon]] fcd85beca174a77755f3fd783416330216add633 403 389 2022-10-14T20:51:16Z StrayDanger 5 wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomSurvivorSkin data asset. Select what survivor this skin targets. [[file:select_survivor.png]] Give it a name and icon. Next create a SurvivorSkinAssets data asset. [[file:survivorasset.png]] This is where you will define the first/third person meshes and materials for your skin. Examples can be found in Win\Tools\Examples then you should be good to get started [[Packaging_your_addon]] 7e55c62e223ce29f411dc9b735161aad7d366921 File:DifficultyCurve2.png 6 11 390 56 2022-09-26T21:57:28Z StrayDanger 5 StrayDanger uploaded a new version of [[File:DifficultyCurve2.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:WaveOutline.png 6 14 391 59 2022-09-26T21:57:49Z StrayDanger 5 StrayDanger uploaded a new version of [[File:WaveOutline.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Boss spawn.png 6 204 392 2022-09-26T22:10:04Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:UE4Editor 3ljmsk8mzf.png 6 205 393 2022-09-26T22:14:18Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Info holdout lootbox.png 6 206 394 2022-09-26T22:15:10Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Perk lootbox.png 6 207 396 2022-09-26T22:21:45Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Lootmanager details.png 6 208 397 2022-09-26T22:22:05Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Logic tree.png 6 209 398 2022-09-26T22:29:18Z StrayDanger 5 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Material fov detail.png 6 210 405 2022-12-02T02:16:04Z StrayJules 9 Close up of the FOV Material Function on the Material Editor for MM_CharmBase.uasset wikitext text/x-wiki == Summary == Close up of the FOV Material Function on the Material Editor for MM_CharmBase.uasset cf679b0a19e381266bae34b711b0b7800e210ac3 File:Materialpaste.jpg 6 211 406 2022-12-02T02:20:07Z StrayJules 9 Example location of where to paste MM_CharmBase.uasset wikitext text/x-wiki == Summary == Example location of where to paste MM_CharmBase.uasset f7d1241abd7a736baef9c06f69d5dc6b3b7e5a38 File:Modkit 0000 gunintro.jpg 6 212 407 2022-12-02T02:21:07Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0001 preferences.jpg 6 213 408 2022-12-02T02:21:39Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Gun Charm Quickstart Guide 0 199 409 402 2022-12-02T02:33:15Z StrayJules 9 Gun Charm Quickstart Guide wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to [[Importing your models to the Mod Kit]] If you want to follow along, you can download the Penguin files here: [[file:PenguinCharm.zip]] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to very that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0013_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0014_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_modinfo_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_modinfo_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/] [[file:modkit_0017_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [[file:MM_CharmBase.uasset]] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ====Create a Loadout Preview Image==== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! [[file:theend.jpg|900px|center|]] f3d23a550ecd07498b718baaaa58e267927c7ed9 437 409 2022-12-02T18:16:20Z StrayJules 9 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to [[Importing your models to the Mod Kit]] If you want to follow along, you can download the Penguin files here: [[file:PenguinCharm.zip]] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to very that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [[file:MM_CharmBase.uasset]] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ====Create a Loadout Preview Image==== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] be5bd4dc32997c886daf8d32a910e9c77f6a5f6e 439 437 2022-12-02T21:19:04Z StrayJules 9 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to '''Importing your custom assets to UE4''' If you want to follow along, you can download the Penguin files here: [https://a.storyblok.com/f/116458/x/3c79a652a6/demo_penguincharm.zip/ Demo_PenguinCharm.zip] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to very that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/ Epic's Import files to UE] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/ Epic's FBX Import Options for UE] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [https://a.storyblok.com/f/116458/x/f9effe7ac9/mm_charmbase.uasset/ MM_CharmBase.uasset] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ====Create a Loadout Preview Image==== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] d62166c4350429606c5cd4a619366d1d6b620a7d 440 439 2022-12-02T21:22:17Z StrayJules 9 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to '''Importing your custom assets to UE4''' If you want to follow along, you can download the Penguin files here: [https://a.storyblok.com/f/116458/x/3c79a652a6/demo_penguincharm.zip/ Demo_PenguinCharm.zip] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to very that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/ Epic's Import files to UE] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/ Epic's FBX Import Options for UE] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [https://a.storyblok.com/f/116458/x/f9effe7ac9/mm_charmbase.uasset/ MM_CharmBase.uasset] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ===Create a Loadout Preview Image=== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] e295b2203d8f81b1a79294f9a5722f2aa6579b63 441 440 2022-12-02T21:35:27Z StrayJules 9 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to '''Importing your custom assets to UE4''' If you want to follow along, you can download the Penguin files here: [https://a.storyblok.com/f/116458/x/3c79a652a6/demo_penguincharm.zip Demo_PenguinCharm.zip] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to very that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/ Epic's Import files to UE] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/ Epic's FBX Import Options for UE] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [https://a.storyblok.com/f/116458/x/f9effe7ac9/mm_charmbase.uasset MM_CharmBase.uasset] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ===Create a Loadout Preview Image=== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] 72ec0c0bb4ba091edda9a599a8c8b610a8e430e2 442 441 2022-12-02T21:45:58Z Will 10 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis using Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to '''Importing your custom assets to UE4''' If you want to follow along, you can download the Penguin files here: [https://a.storyblok.com/f/116458/x/3c79a652a6/demo_penguincharm.zip Demo_PenguinCharm.zip] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to verify that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/ Epic's Import files to UE] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/ Epic's FBX Import Options for UE] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [https://a.storyblok.com/f/116458/x/f9effe7ac9/mm_charmbase.uasset MM_CharmBase.uasset] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ===Create a Loadout Preview Image=== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging_your_addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] 07a0db2f3a957b02b22dc7124bdfde06fc4ae66e File:Modkit 0002 mayaimport.jpg 6 214 410 2022-12-02T02:33:44Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0003 mayaimport fbx.jpg 6 215 411 2022-12-02T02:33:58Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0023 materialsetting.jpg 6 216 412 2022-12-02T02:34:18Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0008 exportset.jpg 6 217 413 2022-12-02T02:34:31Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0019 importsettings.jpg 6 218 414 2022-12-02T02:34:42Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Theend.jpg 6 219 415 2022-12-02T02:34:54Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0009 ue4intro.jpg 6 220 417 2022-12-02T17:50:55Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0010 CreateMod.jpg 6 221 418 2022-12-02T17:51:06Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0011 workspace.jpg 6 222 419 2022-12-02T17:51:34Z StrayJules 9 unreal 4 workspace folder wikitext text/x-wiki == Summary == unreal 4 workspace folder f5cde2d179cec4411b37def7a619ea6362efe318 File:Modkit 0013 modinfo dataasset.jpg 6 223 420 2022-12-02T17:51:55Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0014 customcharm dataasset.jpg 6 224 421 2022-12-02T17:52:07Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0015 customcharm dataasset info.jpg 6 225 422 2022-12-02T17:52:38Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0016 dataassets.jpg 6 226 423 2022-12-02T17:53:42Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0018 importto2.jpg 6 227 424 2022-12-02T17:55:39Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0020 opt diffuse.jpg 6 228 425 2022-12-02T17:56:55Z StrayJules 9 base color map settings wikitext text/x-wiki == Summary == base color map settings aab97c47e0ac8a4153371ad7604c14508dd7145b File:Modkit 0021 opt normal.jpg 6 229 426 2022-12-02T17:57:10Z StrayJules 9 normal map settings wikitext text/x-wiki == Summary == normal map settings b85841beb959f6a8370f367608006c5cc6b31ef4 File:Modkit 0022 opt orm.jpg 6 230 427 2022-12-02T17:57:29Z StrayJules 9 occlusion, roughness, metallic wikitext text/x-wiki == Summary == occlusion, roughness, metallic d98c0daa7fe7125b57c1fdddb4931918b14a35c1 File:Modkit 0024 plugmaterial.jpg 6 231 428 2022-12-02T17:57:45Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0025 charmassetfill.jpg 6 232 429 2022-12-02T17:57:58Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0026 penguiningame.jpg 6 233 430 2022-12-02T17:58:23Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0027 exampleingameimage.jpg 6 234 431 2022-12-02T17:58:37Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0004 custommeshsize1.jpg 6 235 432 2022-12-02T18:00:57Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0005 custommeshsizefix.jpg 6 236 433 2022-12-02T18:01:08Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0006 custommeshexport.jpg 6 237 434 2022-12-02T18:01:23Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0007 exportname.jpg 6 238 435 2022-12-02T18:01:35Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0029 packagemod.jpg 6 239 436 2022-12-02T18:02:26Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Modkit 0012 dataasset.jpg 6 240 438 2022-12-02T18:19:04Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Head Accessory Quickstart Guide 0 200 443 401 2022-12-06T22:21:07Z StrayJules 9 wikitext text/x-wiki ==Head Accessory Quickstart Guide== In this guide, we will go over how to add a Head Accessory to the Anacrusis using the Steam Workshop This assumes you have a basic knowledge of 3d modeling and Unreal Engine. For a more beginner friendly, step-by-step guide, please see the [[Gun Charm Quickstart Guide]] ===What is a Head Accessory?=== [[file:acc_0000_start.jpg|900px|center|]] In the Anacrusis, a Head Accessory is anything that is attached to the player model. It can be anything from glasses, masks, helmets or tiaras, anything that moves with the player character's head. ===Making a Custom Head Accessory=== Before you start, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Once that is installed, you will need a 3d mesh file, usually a .obj or .fbx file. You can create one in any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_AccessoryBase.ma In this file there are examples of head accessories from the Anacrusis, as well as a Generic Male character to use as reference for your own custom 3d models. The most important thing to keep in mind with Head Accessories is your 'Pivot Placement' . The pivot of your custom mesh must be on 0,0,0 to correctly align with the player's head. Note: Each character in the Anacrusis has a different head shape, so if you want to make one accessory that fits every survivor, it is a good idea to test locally and adjust your model's scale until it fits all of them. See [[Packaging Your Addon]] to find out how to test your mod locally before publishing it to the Steam Workshop. Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== On the editor, select Create Mod. More info on [[Installing the Mod Kit]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.This folder will be your Workspace, where you will add all the assets related to your mod. Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo You can name this whatever you like, double click it to open and fill out the info on it. Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. For Head Accessories, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomAccessory Like the first DataAsset you can name it whatever you like Next, import your 3d model and texture files to your workspace folder Create a material for your actor. This can be as simple or as complex as you'd like. For more info on making your own material see Epic's Materials How-To's page [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/ Epic's Materials How-To's page] Import a Loadout Preview Image. You can create this in-engine or any software of your choice. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. ===CustomAccessory Settings=== Now, open the CustomAccessory DataAsset, Valid Personas - This is where you select what survivor is this accessory for. To select a survivor click on the plus sign and choose the Persona you want. For a accessory that fits all of them, keep adding a persona until you have all 4 listed like shown. 'Display Name'- The name for the accessory that will be shown in-game 'Accessory Mesh' - the accessory static actor 'Loadout Preview Image' - This can be any image, it will show up in the game when you select that charm in your loadout screen. Once that is done, you can now get started on [[Packaging your Addon]]! fa498415cab71b41ccf4d596b8b5ad85c60ed97a 444 443 2022-12-06T22:21:25Z StrayJules 9 wikitext text/x-wiki In this guide, we will go over how to add a Head Accessory to the Anacrusis using the Steam Workshop This assumes you have a basic knowledge of 3d modeling and Unreal Engine. For a more beginner friendly, step-by-step guide, please see the [[Gun Charm Quickstart Guide]] ===What is a Head Accessory?=== [[file:acc_0000_start.jpg|900px|center|]] In the Anacrusis, a Head Accessory is anything that is attached to the player model. It can be anything from glasses, masks, helmets or tiaras, anything that moves with the player character's head. ===Making a Custom Head Accessory=== Before you start, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Once that is installed, you will need a 3d mesh file, usually a .obj or .fbx file. You can create one in any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_AccessoryBase.ma In this file there are examples of head accessories from the Anacrusis, as well as a Generic Male character to use as reference for your own custom 3d models. The most important thing to keep in mind with Head Accessories is your 'Pivot Placement' . The pivot of your custom mesh must be on 0,0,0 to correctly align with the player's head. Note: Each character in the Anacrusis has a different head shape, so if you want to make one accessory that fits every survivor, it is a good idea to test locally and adjust your model's scale until it fits all of them. See [[Packaging Your Addon]] to find out how to test your mod locally before publishing it to the Steam Workshop. Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== On the editor, select Create Mod. More info on [[Installing the Mod Kit]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.This folder will be your Workspace, where you will add all the assets related to your mod. Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo You can name this whatever you like, double click it to open and fill out the info on it. Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. For Head Accessories, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomAccessory Like the first DataAsset you can name it whatever you like Next, import your 3d model and texture files to your workspace folder Create a material for your actor. This can be as simple or as complex as you'd like. For more info on making your own material see Epic's Materials How-To's page [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/ Epic's Materials How-To's page] Import a Loadout Preview Image. You can create this in-engine or any software of your choice. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. ===CustomAccessory Settings=== Now, open the CustomAccessory DataAsset, Valid Personas - This is where you select what survivor is this accessory for. To select a survivor click on the plus sign and choose the Persona you want. For a accessory that fits all of them, keep adding a persona until you have all 4 listed like shown. 'Display Name'- The name for the accessory that will be shown in-game 'Accessory Mesh' - the accessory static actor 'Loadout Preview Image' - This can be any image, it will show up in the game when you select that charm in your loadout screen. Once that is done, you can now get started on [[Packaging your Addon]]! 4b5e7578cf660d65d209d8538455f01ad550479e 445 444 2022-12-06T22:22:17Z StrayJules 9 wikitext text/x-wiki In this guide, we will go over how to add a Head Accessory to the Anacrusis using the Steam Workshop This assumes you have a basic knowledge of 3d modeling and Unreal Engine. For a more beginner friendly, step-by-step guide, please see the [[Gun Charm Quickstart Guide]] ===What is a Head Accessory?=== [[file:acc_0000_start.jpg|900px|center|]] In the Anacrusis, a Head Accessory is anything that is attached to the player model. It can be anything from glasses, masks, helmets or tiaras, anything that moves with the player character's head. ===Making a Custom Head Accessory=== Before you start, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Once that is installed, you will need a 3d mesh file, usually a .obj or .fbx file. You can create one in any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_AccessoryBase.ma In this file there are examples of head accessories from the Anacrusis, as well as a Generic Male character to use as reference for your own custom 3d models. The most important thing to keep in mind with Head Accessories is your 'Pivot Placement' . The pivot of your custom mesh must be on 0,0,0 to correctly align with the player's head. Note: Each character in the Anacrusis has a different head shape, so if you want to make one accessory that fits every survivor, it is a good idea to test locally and adjust your model's scale until it fits all of them. See [[Packaging Your Addon]] to find out how to test your mod locally before publishing it to the Steam Workshop. Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== On the editor, select Create Mod. More info on [[Installing the Mod Kit]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.This folder will be your Workspace, where you will add all the assets related to your mod. Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo You can name this whatever you like, double click it to open and fill out the info on it. Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. For Head Accessories, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomAccessory Like the first DataAsset you can name it whatever you like Next, import your 3d model and texture files to your workspace folder Create a material for your actor. This can be as simple or as complex as you'd like. For more info on making your own material see Epic's Materials How-To's page [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/ Epic's Materials How-To's page] Import a Loadout Preview Image. You can create this in-engine or any software of your choice. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. ===CustomAccessory Settings=== Now, open the CustomAccessory DataAsset, Valid Personas - This is where you select what survivor is this accessory for. To select a survivor click on the plus sign and choose the Persona you want. For a accessory that fits all of them, keep adding a persona until you have all 4 listed like shown. 'Display Name'- The name for the accessory that will be shown in-game 'Accessory Mesh' - the accessory static actor 'Loadout Preview Image' - This can be any image, it will show up in the game when you select that charm in your loadout screen. Once that is done, you can now get started on [[Packaging_your_addon]]! dc1bf675bbdaa283687513736a205e8f84985bdb 446 445 2022-12-06T22:29:05Z StrayJules 9 wikitext text/x-wiki In this guide, we will go over how to add a Head Accessory to the Anacrusis using the Steam Workshop This assumes you have a basic knowledge of 3d modeling and Unreal Engine. For a more beginner friendly, step-by-step guide, please see the [[Gun Charm Quickstart Guide]] ===What is a Head Accessory?=== [[file:acc_0000_start.jpg|900px|center|]] In the Anacrusis, a Head Accessory is anything that is attached to the player model. It can be anything from glasses, masks, helmets or tiaras, anything that moves with the player character's head. ===Making a Custom Head Accessory=== Before you start, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Once that is installed, you will need a 3d mesh file, usually a .obj or .fbx file. You can create one in any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_AccessoryBase.ma [[file:acc_0001_mayabase.jpg|1000px|center|]] In this file there are examples of head accessories from the Anacrusis, as well as a Generic Male character to use as reference for your own custom 3d models. The most important thing to keep in mind with Head Accessories is your 'Pivot Placement' . The pivot of your custom mesh must be on 0,0,0 to correctly align with the player's head. [[file:acc_0002_mayapivot.jpg|1000px|center|]] Note: Each character in the Anacrusis has a different head shape, so if you want to make one accessory that fits every survivor, it is a good idea to test locally and adjust your model's scale until it fits all of them. See [[Packaging Your Addon]] to find out how to test your mod locally before publishing it to the Steam Workshop. Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== On the editor, select Create Mod. More info on [[Installing the Mod Kit]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.This folder will be your Workspace, where you will add all the assets related to your mod. Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. [[file:acc_0003_dataasset.jpg|1000px|center|]] This will open a pop up to Pick Data Asset Class, choose ModInfo You can name this whatever you like, double click it to open and fill out the info on it. [[file:acc_0004_modinfo.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. For Head Accessories, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomAccessory [[file:acc_0005_custom1.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like Next, import your 3d model and texture files to your workspace folder Create a material for your actor. This can be as simple or as complex as you'd like. [[file:acc_0009_material.jpg|1000px|center|]] For more info on making your own material see Epic's Materials How-To's page [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/ Epic's Materials How-To's page] ===Import a Loadout Preview Image.=== You can create this in-engine or any software of your choice. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. ===CustomAccessory Settings=== Now, open the CustomAccessory DataAsset, '''Valid Personas''' - This is where you select what survivor is this accessory for. To select a survivor click on the plus sign and choose the Persona you want. For a accessory that fits all of them, keep adding a persona until you have all 4 listed like shown. [[file:acc_0006_custominfo.jpg|1000px|center|]] [[file:acc_0007_persona1.jpg|1000px|center|]] [[file:acc_0008_personadone.jpg|1000px|center|]] '''Display Name'''- The name for the accessory that will be shown in-game '''Accessory Mesh''' - the accessory static actor '''Loadout Preview Image''' - This can be any image, it will show up in the game when you select that charm in your loadout screen. Once that is done, you can now get started on [[Packaging_your_addon]]! [[file:visorend.jpg|900px|center|]] 881c0d88367ff4084a0744167876a86f3b01164c File:Acc 0000 start.jpg 6 241 447 2022-12-06T22:29:19Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0001 mayabase.jpg 6 242 448 2022-12-06T22:29:28Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0002 mayapivot.jpg 6 243 449 2022-12-06T22:29:36Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0003 dataasset.jpg 6 244 450 2022-12-06T22:29:44Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0004 modinfo.jpg 6 245 451 2022-12-06T22:29:54Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0005 custom1.jpg 6 246 452 2022-12-06T22:30:02Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0006 custominfo.jpg 6 247 453 2022-12-06T22:30:10Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0007 persona1.jpg 6 248 454 2022-12-06T22:30:19Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0008 personadone.jpg 6 249 455 2022-12-06T22:30:30Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Acc 0009 material.jpg 6 250 456 2022-12-06T22:30:39Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Visorend.jpg 6 251 457 2022-12-06T22:30:47Z StrayJules 9 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Installing the Mod Kit 0 50 462 369 2023-01-13T21:04:02Z StrayDanger 5 wikitext text/x-wiki ==Setting up the Mod== First, download the Conchiglie Editor package from the Epic Games launcher; it takes up over 50 GB of space, so make sure you have enough space. After installing it, you can launch the editor via the Epic Games library. The first time you do this, it will take a little longer. As the editor launches you might see the following messages. You'll want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Once you've got the Mod Kit running look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. [[file:1312312321312321ffsfCapture.PNG]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a maps directory inside of that. For the mod, we are just going to treat the root directory as our content directory so let's add a maps directory now by right clicking inside the content directory and choose New Directory and name it maps. Now let's get to making our first map and start the [[Making A Map]] tutorial. bf4288ccf5a43e582734e2b6c147036f33f25ad2 Creating a custom Character in Maya 0 312 522 2023-03-28T19:50:26Z StrayJules 9 quick guide on adding your custom character to the rig in Autodesk Maya wikitext text/x-wiki This is a guide for how to import your own custom Survivor in Autodesk Maya to UE. To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Before you import, make sure your Maya settings are accurate. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Import your own mesh by going to File > Import Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. Once your model is as close as possible, select your new model and the XForm rig. On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. Now, you can see the bind is not exactly right. The weights need adjusting. A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. Reset your rig and let's export the rigged model! Select the new model, the XForm rig and go Export Selection > Select fbx Make sure your settings are correct (triangulate is optional) Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. Make sure that you are using the player_skeleton. And there, your new mesh should work with the existing animation sets. Troubleshooting: My mesh looks really weird when it animates, like some kind of noodle hellscape? This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh ce8b4e787706101fe5fa08b7a3a6180cac07aa3a 527 522 2023-03-28T20:56:13Z StrayJules 9 wikitext text/x-wiki This is a guide for how to import your own custom Survivor in Autodesk Maya to UE. To start you will need to open \ModSupport\ModSupport_CharacterBase.ma [[file:001.jpg|center|]] Before you import, make sure your Maya settings are accurate. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Import your own mesh by going to File > Import Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. Once your model is as close as possible, select your new model and the XForm rig. On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. Now, you can see the bind is not exactly right. The weights need adjusting. A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. Reset your rig and let's export the rigged model! Select the new model, the XForm rig and go Export Selection > Select fbx Make sure your settings are correct (triangulate is optional) Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. Make sure that you are using the player_skeleton. And there, your new mesh should work with the existing animation sets. Troubleshooting: My mesh looks really weird when it animates, like some kind of noodle hellscape? This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh 6d0d556b44e9172f43dab3c768e73c565ac49861 528 527 2023-03-28T21:02:52Z StrayJules 9 wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|900px|center|]] Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Import your own mesh by going to File > Import [[file:001.jpg|900px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|900px|center|]] [[file:003.jpg|900px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|900px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|900px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|900px|center|]] [[file:007.jpg|900px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|900px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|900px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|900px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|900px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|900px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|900px|center|]] [[file:014.jpg|900px|center|]] Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|900px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|900px|center|]] [[file:018.jpg|900px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== My mesh looks really weird when it animates, like some kind of noodle hellscape? This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh b822894b836e1037dd68c8e0e36c31fe8aa66d72 529 528 2023-03-28T21:04:05Z StrayJules 9 wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|900px|center|]] Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Import your own mesh by going to File > Import [[file:001.jpg|900px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|900px|center|]] [[file:003.jpg|900px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|900px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|900px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|900px|center|]] [[file:007.jpg|900px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|900px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|900px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|900px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|900px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|900px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|900px|center|]] [[file:014.jpg|900px|center|]] Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|900px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|900px|center|]] [[file:018.jpg|900px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== '''My mesh looks really weird when it animates, like some kind of noodle hellscape?''' This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh 82f629f89a7a85ee574081d13895325660376dc9 548 529 2023-03-28T21:09:54Z StrayJules 9 /* This is a guide for how to import your own custom Survivor in Autodesk Maya to UE. */ wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|700px|center|]] Import your own mesh by going to File > Import [[file:001.jpg|900px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|900px|center|]] [[file:003.jpg|900px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|900px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|900px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|900px|center|]] [[file:007.jpg|900px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|900px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|900px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|900px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|900px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|900px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|900px|center|]] [[file:014.jpg|900px|center|]] Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|900px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|900px|center|]] [[file:018.jpg|900px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== '''My mesh looks really weird when it animates, like some kind of noodle hellscape?''' This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh fa0a4f53d0c1ac313cb0553b2e07c943b89b383b 549 548 2023-03-28T21:10:45Z StrayJules 9 /* This is a guide for how to import your own custom Survivor in Autodesk Maya to UE. */ wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|700px|center|]] Import your own mesh by going to File > Import [[file:001.jpg|1000px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|1000px|center|]] [[file:003.jpg|1000px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|1000px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|900px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|900px|center|]] [[file:007.jpg|900px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|900px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|900px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|900px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|900px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|900px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|900px|center|]] [[file:014.jpg|900px|center|]] Save your fbx. In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|900px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|900px|center|]] [[file:018.jpg|900px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== '''My mesh looks really weird when it animates, like some kind of noodle hellscape?''' This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh 761e762b0f276e5ec5b8ac6b3eb3675f197e05e7 550 549 2023-03-28T21:12:02Z StrayJules 9 /* This is a guide for how to import your own custom Survivor in Autodesk Maya to UE. */ wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|700px|center|]] Import your own mesh by going to File > Import [[file:001.jpg|1000px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|1000px|center|]] [[file:003.jpg|1000px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|1000px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|1000px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|1000px|center|]] [[file:007.jpg|1000px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|1000px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|1000px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|1000px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|1000px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|1000px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|1000px|center|]] [[file:014.jpg|1000px|center|]] Save your fbx. ===Importing into Unreal Engine=== In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|1000px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|1000px|center|]] [[file:018.jpg|1000px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== '''My mesh looks really weird when it animates, like some kind of noodle hellscape?''' This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh 6edeca9d2ffe6dbf243c008233d5f3a5f39a495e 551 550 2023-03-28T21:45:30Z StrayJules 9 /* Troubleshooting: */ wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Autodesk Maya to UE.== To start you will need to open \ModSupport\ModSupport_CharacterBase.ma Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'XForm' Before you import, make sure your Maya settings are accurate. You can find your settings on Windows > Setting/Preferences > Preferences. In this case you need to be in centimeters and have your up axis be Z (that is how Unreal labels it) [[file:000.jpg|700px|center|]] Import your own mesh by going to File > Import [[file:001.jpg|1000px|center|]] Select the fbx you want to use for your new model. A pop up will appear giving your more information about the fbx import settings, adjust those if required, otherwise leave them at default. Press import. [[file:002.jpg|1000px|center|]] [[file:003.jpg|1000px|center|]] In my case the Nessa mesh was very close to the existing Generic_Male_Modeling_Base. It needs to have the same scale, joing position ( not be T-Posing) and pivot. You might need to rotate and adjust yours so it is as close as possible to the existing model. The closer it is to the existing rig, the least amount of cleanup you will have to do. [[file:004.jpg|1000px|center|]] Once your model is as close as possible, select your new model and the XForm rig. [[file:005.jpg|1000px|center|]] On the Menu Set Menu, select Rigging, then on the top menu Skin > Bind Skin. This will bind your new model to the existing rig. [[file:006.jpg|1000px|center|]] [[file:007.jpg|1000px|center|]] Now, you can see the bind is not exactly right. The weights need adjusting. [[file:008.jpg|1000px|center|]] A quick way to transfer your weights from one model to another is the 'Copy Skin Weight' function. So let's do that. [[file:009.jpg|1000px|center|]] First you have to select the old model, the one you want to take the skin weights from. Then select your new model, then go Skin > Copy Skin Weights. Now Nessa's model is working as intended. [[file:010.jpg|1000px|center|]] Reset your rig and let's export the rigged model! [[file:011.jpg|1000px|center|]] Select the new model, the XForm rig and go Export Selection > Select fbx [[file:012.jpg|1000px|center|]] Make sure your settings are correct (triangulate is optional) [[file:013.jpg|1000px|center|]] [[file:014.jpg|1000px|center|]] Save your fbx. ===Importing into Unreal Engine=== In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|1000px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|1000px|center|]] [[file:018.jpg|1000px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] ==Troubleshooting:== '''My mesh looks really weird when it animates, like some kind of noodle hellscape?''' This is probably because of the skin weights. You can fix your mesh's weight in Maya by going Skin > Paint Skin Weight Options Box (it is the box icon next to the text) and using the Paint Skin weight tool to fix your model. [[file:bonus_000.jpg|1000px|center|]] [[file:bonus_001.jpg|1000px|center|]] For more on transfering weights and general Maya Rigs, check out this channel: https://www.youtube.com/watch?v=BbKDxKKFh-U For more on importing skeletal meshes to UE4 https://docs.unrealengine.com/4.27/en-US/WorkingWithContent/Importing/FBX/SkeletalMeshes/#importmesh 591493f2703ba41b9a117fb2ec659aeb9020dd43 Main Page 0 1 523 383 2023-03-28T19:53:02Z StrayJules 9 /* Additional Pages */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Progress Meters]] [[Jump Pads]] c884a1f419a0852063da0ba3ddc167173503e3ce 568 523 2023-03-30T21:30:55Z Nerdie 346 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] 9104436b77eb778cfd6abca5dafaf23be0d04d9d File:002.jpg 6 314 525 2023-03-28T20:54:57Z StrayJules 9 custom char 002 wikitext text/x-wiki == Summary == custom char 002 24a73fdd0e78fe45da045e46f3e3ecb7e998903c File:001.jpg 6 315 526 2023-03-28T20:55:19Z StrayJules 9 Custom char 002 wikitext text/x-wiki == Summary == Custom char 002 f57ed3625e7b2ceb14e8d0c40648f9d2e7e23f83 File:003.jpg 6 316 530 2023-03-28T21:04:33Z StrayJules 9 custom character 003 wikitext text/x-wiki == Summary == custom character 003 dae54c05ec45f582d5a663818c8098fb08d508fe File:004.jpg 6 317 531 2023-03-28T21:04:43Z StrayJules 9 custom character 004 wikitext text/x-wiki == Summary == custom character 004 3ec7d2c11ce84e461645143875f5abe16a4176c6 File:005.jpg 6 318 532 2023-03-28T21:04:53Z StrayJules 9 custom character 005 wikitext text/x-wiki == Summary == custom character 005 615a04399c05676b8c067ea3f3e6b9cec92ca5f6 File:006.jpg 6 319 533 2023-03-28T21:05:04Z StrayJules 9 custom character 006 wikitext text/x-wiki == Summary == custom character 006 709139fefd1157ed7bd9b885bc86b9e9cfae2b67 File:007.jpg 6 320 534 2023-03-28T21:05:14Z StrayJules 9 custom character 007 wikitext text/x-wiki == Summary == custom character 007 c1bf1ab226860c79cfa06b6a23743f7791954f97 File:008.jpg 6 321 535 2023-03-28T21:05:32Z StrayJules 9 custom character 008 wikitext text/x-wiki == Summary == custom character 008 aea4d476ca189fb44362ef021b7f24a6b189edfb File:009.jpg 6 322 536 2023-03-28T21:05:46Z StrayJules 9 custom character 009 wikitext text/x-wiki == Summary == custom character 009 575c661cfdd942d5c58da14e6de928530cb1d0c0 File:010.jpg 6 323 537 2023-03-28T21:06:00Z StrayJules 9 custom character 010 wikitext text/x-wiki == Summary == custom character 010 63ac6255d3168c4cb1434650732649215e1d372c File:011.jpg 6 324 538 2023-03-28T21:06:09Z StrayJules 9 custom character 011 wikitext text/x-wiki == Summary == custom character 011 e7ca9dc0b2ee4f7e1e1c3cef95fe2eefc62f173d File:012.jpg 6 325 539 2023-03-28T21:06:21Z StrayJules 9 custom character 012 wikitext text/x-wiki == Summary == custom character 012 95e670c88496c4de5f244b9181604a425069095a File:013.jpg 6 326 540 2023-03-28T21:06:33Z StrayJules 9 custom character 013 wikitext text/x-wiki == Summary == custom character 013 f1f72a5fb89e23dd542bb4732095ba7b400ff72b File:014.jpg 6 327 541 2023-03-28T21:06:44Z StrayJules 9 custom character 014 wikitext text/x-wiki == Summary == custom character 014 1744563bd19f5ee35f2a714fda17a6156d26291c File:015.jpg 6 328 542 2023-03-28T21:06:56Z StrayJules 9 custom character 015 wikitext text/x-wiki == Summary == custom character 015 b0394756cdf509524348d0787597b766be763ba2 File:016.jpg 6 329 543 2023-03-28T21:07:07Z StrayJules 9 custom character 016 wikitext text/x-wiki == Summary == custom character 016 c1e40bdaaa589760df0cd581da8ea0e186d01625 File:017.jpg 6 330 544 2023-03-28T21:07:19Z StrayJules 9 custom character 017 wikitext text/x-wiki == Summary == custom character 017 b7274cbbc5fb00a6d66b98fccecc771e86945e76 File:018.jpg 6 331 545 2023-03-28T21:07:31Z StrayJules 9 custom character 018 wikitext text/x-wiki == Summary == custom character 018 ea954a4f10ae8ba84ccbb7ce94f4f1a94a1bdf26 File:019.jpg 6 332 546 2023-03-28T21:07:41Z StrayJules 9 custom character 019 wikitext text/x-wiki == Summary == custom character 019 d89e00d4c62ee82a2f0fff353005e0c1ed8b2221 File:000.jpg 6 333 547 2023-03-28T21:08:37Z StrayJules 9 Custom Characters 000 - settings wikitext text/x-wiki == Summary == Custom Characters 000 - settings b7e449f63ccebd826728c21635b499dd02c1ccfe File:Bonus 000.jpg 6 334 552 2023-03-28T21:45:51Z StrayJules 9 custom char bonus 000 wikitext text/x-wiki == Summary == custom char bonus 000 63c63a3116e9c8b092a66798d3bfcb66545e1a89 File:Bonus 001.jpg 6 335 553 2023-03-28T21:46:06Z StrayJules 9 custom character bonus 001 wikitext text/x-wiki == Summary == custom character bonus 001 4b51149b27c10a423c242425cf88c7b9962f1632 File:PlayerSkinsDataAssetFPP.PNG 6 340 558 2023-03-30T11:40:20Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:PlayerSkinsDataAssetTPP.PNG 6 341 559 2023-03-30T11:40:28Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Survivor Skin Quickstart Guide 0 203 560 403 2023-03-30T11:46:42Z Nerdie 346 i added the playerskins data asset since the other survivorskins data asset was deprecated wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomSurvivorSkin data asset. Select what survivor this skin targets. [[file:select_survivor.png]] Give it a name and icon. Next create a PlayerSkins data asset. [[File:PlayerSkinsDataAssetFPP.PNG]] [[File:PlayerSkinsDataAssetTPP.PNG]] This is where you will define the first/third person meshes and materials for your skin. ''NOTE: Third person data requires three meshes, Hair, Head, and Body. You can avoid having this by creating a blank mesh and applying it to required body parts.'' Examples can be found in Win\Tools\Examples then you should be good to get started [[Packaging_your_addon]] 9feb5c04023a1ce12cc4de8c7aaa2bece6e78b8a User:Nerdie 2 342 561 2023-03-30T12:02:44Z Nerdie 346 Created page with "==Welcome!== Hi, I'm Nerdie and I mod The Anacrusis! I work in Blender and Paint.NET! My mods can be found here: ''https://steamcommunity.com/id/nerdberd/myworkshopfiles/?appid=1120480''" wikitext text/x-wiki ==Welcome!== Hi, I'm Nerdie and I mod The Anacrusis! I work in Blender and Paint.NET! My mods can be found here: ''https://steamcommunity.com/id/nerdberd/myworkshopfiles/?appid=1120480'' 6e22c087faa05636e407d99bff4203abee9d1c60 File:BetterFBX-importsettings.png 6 343 562 2023-03-30T21:08:38Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:BetterFBX-exportsettings1.png 6 344 563 2023-03-30T21:08:45Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:BetterFBX-exportsettings2.png 6 345 564 2023-03-30T21:08:49Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:SetParent-Blender.png 6 346 565 2023-03-30T21:12:37Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:SimilarPositions-Blender.png 6 347 566 2023-03-30T21:18:40Z Nerdie 346 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Creating a custom Character in Blender 0 348 567 2023-03-30T21:28:44Z Nerdie 346 this is a fork of jules' maya tutorial! WIP wikitext text/x-wiki ==This is a guide for how to import your own custom Survivor in Blender to UE.== To start you will need BetterFBX Import and Export: https://blendermarket.com/products/better-fbx-importer--exporter Make sure the plug-in is enabled by going into Edit > Preferences > Add-ons > Install Import ModSupport_CharacterBase.fbx by going to File > Import > Better FBX Importer and use these settings: [[File:BetterFBX-importsettings.png|300px|center|]] Inside that file there is a generic rigged 3rd Person character mesh (Generic_Male_Modeling_Base), a generic First Person rig with just the arms (Generic_Male_Modding_FPP) and the base character rig 'Armature' ==Appending your weighted model to the Anacrusis Rig== Select the fbx you want to use for your new model and import using these settings [[File:BetterFBX-importsettings.png|300px|center|]] Your model needs to be weighted and similar in position and pose to the mod example model. [[file:SimilarPositions-Blender.png|1000px|center|]] Once your model is as close as possible, select your new model and Shift + Click the Anacrusis rig armature. [[file:SetParent-Blender.png|300px|center|]] This will append your new model to the existing rig. ==Exporting your new model== Select the new model go to File > Export > Better FBX Exporter and use these settings [[File:BetterFBX-exportsettings1.png|300px|center|]] [[File:BetterFBX-exportsettings2.png|300px|center|]] ==Importing into Unreal Engine== In Unreal Engine's content browser, import your skeletal mesh. [[file:015.jpg|1000px|center|]] Make sure that you are using the player_skeleton. [[file:017.jpg|1000px|center|]] [[file:018.jpg|1000px|center|]] And there, your new mesh should work with the existing animations! [[file:019.jpg|900px|center|]] For more on this topic, check out this video: https://youtu.be/cUXLjX8Pku0 ea5c796175ca553ee96d27b6498eb4b9989ba2ee User:MarianneAngel6 2 349 572 2023-03-31T23:37:58Z MarianneAngel6 353 Created page with "I like my hobby Roller Derby. Seems boring? Not!<br>I also to learn French in my spare time.<br><br>My web page :: [https://antibioticsbuying.com/buy-Zithromax-online levitra]" wikitext text/x-wiki I like my hobby Roller Derby. Seems boring? Not!<br>I also to learn French in my spare time.<br><br>My web page :: [https://antibioticsbuying.com/buy-Zithromax-online levitra] 6373a841d0beddd6f7911efe7a32947c61b1988c User:MartiGabb94 2 350 573 2023-04-02T20:12:11Z MartiGabb94 358 Created page with "30 years old Fashion Designer Rey Roten from Woodstock, enjoys motorbikes, live girls and home brewing. In recent times had a family journey to Archaeological Sites of the Island of Meroe.<br><br>My webpage - [https://easybookmark.win/story.php?title=how-to-start-a-business-with-only-bitcoin-news discuss]" wikitext text/x-wiki 30 years old Fashion Designer Rey Roten from Woodstock, enjoys motorbikes, live girls and home brewing. In recent times had a family journey to Archaeological Sites of the Island of Meroe.<br><br>My webpage - [https://easybookmark.win/story.php?title=how-to-start-a-business-with-only-bitcoin-news discuss] b562e92b4f217c85c80dab1198ee473421ef49c0 User:IrvingRobillard 2 352 575 2023-04-04T01:18:33Z IrvingRobillard 294 Created page with "I'm Sven and I live with my husband and our 3 children in Memphis, in the TN south part. My hobbies are Magic, Jewelry making and Table tennis.<br><br>my site ... [http://keycog.com/__media__/js/netsoltrademark.php?d=znodog.com 카지노사이트]" wikitext text/x-wiki I'm Sven and I live with my husband and our 3 children in Memphis, in the TN south part. My hobbies are Magic, Jewelry making and Table tennis.<br><br>my site ... [http://keycog.com/__media__/js/netsoltrademark.php?d=znodog.com 카지노사이트] e0fb59c7667bbbd530a17e8822fc45c6def2061a 576 575 2023-04-04T06:58:17Z IrvingRobillard 294 wikitext text/x-wiki Hello! My name is Armand. <br>It is a little about myself: I live in Netherlands, my city of Rucphen. <br>It's called often Northern or cultural capital of NB. I've married 1 years ago.<br>I have two children - a son (Gerardo) and the daughter (Lawerence). We all like Motor sports.<br><br>My web blog ... [http://skipper-spb.ru/bitrix/rk.php?goto=https://www.casinositetop.com/ 카지노사이트] 7570d497917b660bb0bb8ba5f8f763ca2330c159 User:ShaunDarwin722 2 353 577 2023-04-05T06:40:30Z ShaunDarwin722 418 Created page with "Hello, dear friend! My name is Wallace. I am delighted that I could unite to the whole globe. I live in Australia, in the south region. I dream to see the various nations, to obtain acquainted with fascinating individuals.<br><br>Feel free to surf to my blog post acheter des vues youtube ([https://telegra.ph/The-Standard-Actions-To-Improve-Online-Video-Marketing-Effects-05-24 Full Review])" wikitext text/x-wiki Hello, dear friend! My name is Wallace. I am delighted that I could unite to the whole globe. I live in Australia, in the south region. I dream to see the various nations, to obtain acquainted with fascinating individuals.<br><br>Feel free to surf to my blog post acheter des vues youtube ([https://telegra.ph/The-Standard-Actions-To-Improve-Online-Video-Marketing-Effects-05-24 Full Review]) 21f7f70c167b00a1febc34c77ce6225a0df3a90e Packaging Your Addon 0 354 579 2023-06-17T23:13:29Z StrayDanger 5 Created page with "==Let's Get Cookin== Now that you've made an addon, you need to package it first before you can use it locally First go to the main toolbar of the editor and click "Package" then select the mod you want to package. [[File:Package_mod.png]] Next, it will prompt you as to where you want to save the sba (StrayBombay Archive), once clicking "Select Folder" the packaging process will begin [[File:Cooking.png]] Once it's done cooking you should have a Nazzy sba file where..." wikitext text/x-wiki ==Let's Get Cookin== Now that you've made an addon, you need to package it first before you can use it locally First go to the main toolbar of the editor and click "Package" then select the mod you want to package. [[File:Package_mod.png]] Next, it will prompt you as to where you want to save the sba (StrayBombay Archive), once clicking "Select Folder" the packaging process will begin [[File:Cooking.png]] Once it's done cooking you should have a Nazzy sba file where you saved it, in our case for this example we have MyExampleMod.sba. ==Testing Ingame== Once you package is done cooking you can place it in the Addons directory of the game. If you don't have an addons directory, you can create one next to the Anacrusis.exe like so [[File:addons_folder.png]] ==Uploading to Steam== Navigate to where you installed the ModKit, in that folder there should be a folder called tools, the Workshop Manager can be found there. Once the manager is open you can upload a new addon to the steam workshop by pressing the "New Addon" Button [[File:new_addon_ws.png]] Then select your addons staging directory. a "staging directory" in our context is a folder that contains a preview.png and our sole archive. The recommended size for the preview png is 512x512 and it will appear on the workshop as the icon. Once your addon is on steam you need to goto it's item page and setup the name, description and images. Once your are ready set your addon to public for the world to enjoy ==Updating your tags== First select your mod from the list, then click edit tags, it will bring up this menu [[File:edit_tags_ws.png]] once up, select tags that relate to your addon, correct tags will help with visibility in the workshop. ==Updating your addon== The flow for pushing a new version of your addon is identical to uploading a new addon, but this time you need to select your addon first and click "Update Addon" [[File:update_ws.png]] 2dff97a192786deea9ae417643c8619d7514ca17 Main Page 0 1 580 568 2023-06-17T23:13:51Z StrayDanger 5 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging Your addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] 99b9567220162f1ccd4ff7691c6972b7411430a5 581 580 2023-06-17T23:14:05Z StrayDanger 5 wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Packaging Your Addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] ccf8d49b5af965f555178ca1c0b8bffa7e810e8c 588 581 2023-09-12T07:55:11Z StrayDanger 5 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Setup_Your_Mod]] #[[Packaging Your Addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] 3bb9b1a37b37e9c32af47a3365abe726da74e0a3 590 588 2023-09-12T07:56:04Z StrayDanger 5 /* Getting started */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Setup Your Mod]] #[[Packaging Your Addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] 3d540d91579c5e0728c06786210953d13801ead4 593 590 2023-09-12T08:02:06Z StrayDanger 5 /* Additional Pages */ wikitext text/x-wiki <strong>The Anacrusis Modding Wiki.</strong> Consult the [https://discord.gg/straybombay Discord] for information on modding The Anacrusis == Getting started == #[[Installing the Mod Kit]] #[[Setup Your Mod]] #[[Packaging Your Addon]] == Making a Map == #[[Making A Map]] #[[Blocking Out A Map]] #[[Holdouts & Activation Systems]] #[[Baked Lighting Tutorial]] (Incomplete) #[[Lighting & Level Optimization]] #[[Where art assets live]] (Incomplete) #[[Setting up a Scenario]] == Additional Pages == [[Gun Charm Quickstart Guide]] [[Head Accessory Quickstart Guide]] [[Survivor Skin Quickstart Guide]] [[Holdout Quickstart Guide]] [[Versus Quickstart Guide]] [[Developer Cheats and Debug CVars‎‎]] [[Doors]] [[EmitterToggleable]] [[Toggleable Lights]] [[General Music]] [[Event Music]] [[Conveyor/Fans]] [[Creating a custom Character in Maya]] [[Creating a custom Character in Blender]] [[Progress Meters]] [[Jump Pads]] 94f0a5bc5008a6acd01cb6520f494665b364aa37 Gun Charm Quickstart Guide 0 199 582 442 2023-06-17T23:14:57Z StrayDanger 5 wikitext text/x-wiki ==Creating your first Gun Charm== In this guide, we will go over how to add a Gun Charm Mod to the Anacrusis using Steam Workshop. [[file:modkit_0000_gunintro.jpg|900px|center|]] The first step is to [[Installing the Mod Kit]] Once that is installed, all you need to make your very own Gun Charm is a 3d asset. You can use any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples If you already have your own model and textures set up feel free to skip to '''Importing your custom assets to UE4''' If you want to follow along, you can download the Penguin files here: [https://a.storyblok.com/f/116458/x/3c79a652a6/demo_penguincharm.zip Demo_PenguinCharm.zip] ===Using ModSupport_CharmBase file=== At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_CharmBase.ma Optional: To see the source file correctly: make sure the Z axis is pointing upwards.To do so go to Windows > Settings/Preferences > Preferences. Change World Coordinate System to Z and units to centimeters. [[file:modkit_0001_preferences.jpg|1000px|center|]] In this file you can import your model to verify that its size and placement matches our existing examples. The Charm_Ring model represents where your custom charm will hang from. It is there only as a reference and should not be modified or exported out. You can save a copy of that source file locally and model directly on it or import your existing 3d model to it. ===Importing a custom Model=== To import your model to Maya, go to File > Import, select the folder where your custom model is in and click open [[file:modkit_0002_mayaimport.jpg|1000px|center|]] [[file:modkit_0003_mayaimport_fbx.jpg|1000px|center|]] One thing to keep in mind is your charm’s placement and pivot point location. To snap correctly in place the objects pivot needs to be on 0,0,0 [[file:modkit_0004_custommeshsize1.jpg|1000px|center|]] [[file:modkit_0005_custommeshsizefix.jpg|1000px|center|]] Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] [[file:modkit_0006_custommeshexport.jpg|1000px|center|]] [[file:modkit_0007_exportname.jpg|1000px|center|]] [[file:modkit_0008_exportset.jpg|1000px|center|]] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== [[file:modkit_0009_ue4intro.jpg|1000px|center|]] On the editor, select Create Mod. More info on [[Installing the Mod Kit]] [[file:modkit_0010_CreateMod.jpg|1000px|center|]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.` This folder will be your Workspace, where you will add all the assets related to your mod. [[file:modkit_0011_workspace.jpg|1000px|center|]] Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. This will open a pop up to Pick Data Asset Class, choose ModInfo [[file:modkit_0012_dataasset.jpg|1000px|center|]] You can name this whatever you like, double click it to open and fill out the info on it. [[file:modkit_0013_modinfo_dataasset.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S.` For Gun Charms, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomCharm [[file:modkit_0014_customcharm_dataasset.jpg|1000px|center|]] [[file:modkit_0015_customcharm_dataasset_info.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like. [[file:modkit_0016_dataassets.jpg|1000px|center|]] ===Importing your custom assets to UE4=== To import your files to that folder, click Add/Import > Import to [name of your folder]. More info on Epic [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/HowTo/ContentBrowserImport/ Epic's Import files to UE] [[file:modkit_0018_importto2.jpg|1000px|center|]] A screen will pop up with your import settings: [https://docs.unrealengine.com/5.1/en-US/fbx-import-options-reference-in-unreal-engine/ Epic's FBX Import Options for UE] [[file:modkit_0019_importsettings.jpg|1000px|center|]] You should see your model and textures on the Content Browser now. Optional: for better performance it is better to adjust the settings for your textures so that they are smaller and more efficient. Gun Charms are relatively small assets so they shouldn’t need high resolution settings. Here are some of the texture settings adjustments used for the Base Color, Normal and OcclusionRoughnessMetallic textures. [[file:modkit_0020_opt_diffuse.jpg|1000px|center|]] [[file:modkit_0021_opt_normal.jpg|1000px|center|]] [[file:modkit_0022_opt_orm.jpg|1000px|center|]] ===Creating a Material in UE4=== You can create your custom material in the editor, but because the Gun Charms have to match the guns in first person as well as third person, the charm material needs a particular Material Function to adapt the Gun Charms Field of View to the player’s. [[file:material_fov_detail.png|1000px|center|]] To save time, we made a base material that you can copy and paste to your workspace in the content browser and attach your textures to: [https://a.storyblok.com/f/116458/x/f9effe7ac9/mm_charmbase.uasset MM_CharmBase.uasset] paste it to \Mods\YourAssetName\Content [[file:materialpaste.jpg|1000px|center|]] It should appear automatically on your content browser. Now you can open the material editor and plug in your own textures. [[file:modkit_0023_materialsetting.jpg|1000px|center|]] Add your custom material to the Material Slot on the charm’s static mesh actor. [[file:modkit_0024_plugmaterial.jpg|1000px|center|]] ===Create a Loadout Preview Image=== You will also need a Loadout Preview Image. [[file:modkit_0026_penguiningame.jpg|1000px|center|]] You can use any screenshot of your model for this and import it like the fbx and texture files. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. [[file:modkit_0027_exampleingameimage.jpg|1000px|center|]] Open your CustomCharm.DataAsset Fill out the information on it [[file:modkit_0025_charmassetfill.jpg|1000px|center|]] Display Name - The name that will be displayed in-game Charm Mesh - the charm static actor Loadout Preview Image - This can be any image, it will show up in the game when you select that charm in your loadout [[file:modkit_0029_packagemod.jpg|1000px|center|]] then you should be good to get started [[Packaging Your Addon]]! Congrats! Now you are done making your first Gun Charm!! [[file:theend.jpg|900px|center|]] 915fd976f8ef86376c0be877a56532b636b8b0fe Survivor Skin Quickstart Guide 0 203 583 560 2023-06-17T23:15:21Z StrayDanger 5 wikitext text/x-wiki First, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Then Create a CustomSurvivorSkin data asset. Select what survivor this skin targets. [[file:select_survivor.png]] Give it a name and icon. Next create a PlayerSkins data asset. [[File:PlayerSkinsDataAssetFPP.PNG]] [[File:PlayerSkinsDataAssetTPP.PNG]] This is where you will define the first/third person meshes and materials for your skin. ''NOTE: Third person data requires three meshes, Hair, Head, and Body. You can avoid having this by creating a blank mesh and applying it to required body parts.'' Examples can be found in Win\Tools\Examples then you should be good to get started [[Packaging Your Addon]] bab6d95cff14f9110e1c151524eb53467dd02afb Head Accessory Quickstart Guide 0 200 584 446 2023-06-25T07:52:40Z StrayDanger 5 wikitext text/x-wiki In this guide, we will go over how to add a Head Accessory to the Anacrusis using the Steam Workshop This assumes you have a basic knowledge of 3d modeling and Unreal Engine. For a more beginner friendly, step-by-step guide, please see the [[Gun Charm Quickstart Guide]] ===What is a Head Accessory?=== [[file:acc_0000_start.jpg|900px|center|]] In the Anacrusis, a Head Accessory is anything that is attached to the player model. It can be anything from glasses, masks, helmets or tiaras, anything that moves with the player character's head. ===Making a Custom Head Accessory=== Before you start, make sure you have a mod workspace setup as described in [[Installing the Mod Kit]] Once that is installed, you will need a 3d mesh file, usually a .obj or .fbx file. You can create one in any 3d modeling software you’d like. You can find templates for different types of mods on: Win\Tools\Examples At Stray Bombay, we use Autodesk Maya so for this guide we will start with the Maya Source file that is in \Examples\ModSupport_AccessoryBase.ma [[file:acc_0001_mayabase.jpg|1000px|center|]] In this file there are examples of head accessories from the Anacrusis, as well as a Generic Male character to use as reference for your own custom 3d models. The most important thing to keep in mind with Head Accessories is your 'Pivot Placement' . The pivot of your custom mesh must be on 0,0,0 to correctly align with the player's head. [[file:acc_0002_mayapivot.jpg|1000px|center|]] Note: Each character in the Anacrusis has a different head shape, so if you want to make one accessory that fits every survivor, it is a good idea to test locally and adjust your model's scale until it fits all of them. See [[Packaging Your Addon]] to find out how to test your mod locally before publishing it to the Steam Workshop. Once your custom model is scaled correctly and in the right spot, you can export it by selecting File > Export Selection > save as type: fbx For more on exporting your model, go to [https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Importing/FBX/BestPractices/ Epic's FBX Import Best Practices] For textures you can make them in Substance Painter, Quixel, Photoshop or any other software you’d like. ===Importing your model to the Mod Kit=== On the editor, select Create Mod. More info on [[Installing the Mod Kit]] It will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this.This folder will be your Workspace, where you will add all the assets related to your mod. Next, we will create the ModInfo DataAsset. Click the Add/Import green button, navigate to Miscellaneous > Data Asset. [[file:acc_0003_dataasset.jpg|1000px|center|]] This will open a pop up to Pick Data Asset Class, choose ModInfo You can name this whatever you like, double click it to open and fill out the info on it. [[file:acc_0004_modinfo.jpg|1000px|center|]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. For Head Accessories, you will also need a second DataAsset actor. Same steps, but instead of picking ModInfo, choose CustomAccessory [[file:acc_0005_custom1.jpg|1000px|center|]] Like the first DataAsset you can name it whatever you like Next, import your 3d model and texture files to your workspace folder Create a material for your actor. This can be as simple or as complex as you'd like. [[file:acc_0009_material.jpg|1000px|center|]] For more info on making your own material see Epic's Materials How-To's page [https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/ Epic's Materials How-To's page] ===Import a Loadout Preview Image.=== You can create this in-engine or any software of your choice. For best quality, we suggest a square (512x512px, or 1080x1080), transparent png. ===CustomAccessory Settings=== Now, open the CustomAccessory DataAsset, '''Valid Personas''' - This is where you select what survivor is this accessory for. To select a survivor click on the plus sign and choose the Persona you want. For a accessory that fits all of them, keep adding a persona until you have all 4 listed like shown. [[file:acc_0006_custominfo.jpg|1000px|center|]] [[file:acc_0007_persona1.jpg|1000px|center|]] [[file:acc_0008_personadone.jpg|1000px|center|]] '''Display Name'''- The name for the accessory that will be shown in-game '''Accessory Mesh''' - the accessory static actor '''Loadout Preview Image''' - This can be any image, it will show up in the game when you select that charm in your loadout screen. Once that is done, you can now get started on [[Packaging Your Addon]]! [[file:visorend.jpg|900px|center|]] ccb9c0d1e86b3c82854e1581b52f976ac82a09c7 Setting up a Scenario 0 198 585 384 2023-09-12T07:47:25Z StrayDanger 5 wikitext text/x-wiki ==Creating the Scenario== First, create a new Scenario data asset in your mod. {| class="wikitable" style="margin-right: auto; margin-left: 0px;" |+ Scenario Data |- ! Variable !! Info |- | ScenarioID|| Identifier used to select the scenario via party attributes during matchmaking |- | Display Name || Player-facing name |- | Subtitle || Player-facing subtitle |- | Description|| Player-facing description |- | Objective || Objective string (shown in game) |- | Description|| Player-facing description |- | PreviewImage || Player-facing preview image |- | Personas || Personas available for this scenario |- | GameType || The way this scenario will identify itself in the UI/lobby flow |- | Maps|| Maps played through in this scenario |- | Gamerules|| Gamerules for this scenario |} Personas does not have a default value but is required, copy and past this code block over "Personas" <code> ("Guion","Nessa","Liu","Lance") </code> == Map List == Add the maps in order that they are meant to be played. e.g for ep1 we have this map list #s1c1l1_terminal #s1c1l2_crew #s1c1l3_mall #s1c1l4_park #s1c1l5_bridge == Game Rules == Game Rules are objects that can modify/overwrite existing game features. you can make your own game rules in blueprint or use existing ones, like SBHoldoutGameRulesBP or SBVersusGameRulesBP 37ea47f1344a2db3623f8fec38a4cbe0a2303cb1 Setup Your Mod 0 355 586 2023-09-12T07:53:31Z StrayDanger 5 Created page with "First look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this..." wikitext text/x-wiki First look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] Next you'll want to create your [Mod Info] e3891e2d7ba626c869989e3181f8112fc454410f 589 586 2023-09-12T07:55:45Z StrayDanger 5 wikitext text/x-wiki ==Setting up the Mod== First look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] Next you'll want to create your [Mod Info] 77b92dba85b2d77f54d51beb6861950ac541c54d 591 589 2023-09-12T07:57:55Z StrayDanger 5 /* Setting up the Mod */ wikitext text/x-wiki ==Setting up the Mod== First look to the toolbar and click "Create Mod" [[file:ModToolBarCreate.png]] This will prompt you to enter your mod name in a popup. This will be the mod's internal name, not the mod's actual name. You should avoid using spaces in this. [[file:CreateMod.png]] ===Setting up your workspace=== Once your mod is created, you should see a new top-level directory in your content browser. It will be named "<ModName> Content" Everything for your mod has to be within this folder or it will not be bundled when you package your mod. [[file:ModContentBrowser.png|none|1000px]] Next you'll want to create your [Mod Info] ===Setting up the Mod Info=== For your mod to be property identified ingame we need to create a modinfo. Right-click and create a new DataAsset [[file:NewDataAsset.png]] Select ModInfo [[file:SelectModInfoDataAsset.png]] You can name this whatever you like, once created open it up and fill out the info [[file:ModInfo.png]] Make sure to save after you close that window. When you see a plus symbol on an asset in the editor, it means it needs to be saved. You can save it by clicking it and then pressing Ctrl-S. [[file:1312312321312321ffsfCapture.PNG]] One last thing to think about before you make your first map. You will want to think of creating directories. For The Anacrusis and most Unreal games you create a content directory and then put a content inside of that. For the mod, we are just going to treat the root directory as our content directory 4c7cb1acc1f772e29246752b4a77a9243991750d Installing the Mod Kit 0 50 587 462 2023-09-12T07:54:38Z StrayDanger 5 wikitext text/x-wiki ==Setting up the Mod== First, download the Conchiglie Editor package from the Epic Games launcher; it takes up over 50 GB of space, so make sure you have enough space. After installing it, you can launch the editor via the Epic Games library. The first time you do this, it will take a little longer. As the editor launches you might see the following messages. You'll want to say no to them. Pick no to updating Wwise [[file:Preset1Capture.PNG]] Pick not now for the update [[file:Preset2.PNG]] Pick Don't Import for content files. [[file:Preset3.PNG]] Now let's get to making our but first we need to [[Setup Your Mod]]. 582c67f789cf32ef692772151046d7089071a911 Versus Quickstart Guide 0 356 592 2023-09-12T08:01:38Z StrayDanger 5 Created page with "== Adding Versus to your map in 5 easy steps == You should have an existing Scenario, if not see [[Setting up a Scenario]] # Duplicate your existing Scenario, Make sure to change the ID. # Set the GameType to Versus, NumSurvivors to 8, and the GameRules to VersusGameRulesBP, # Go through and Mark Special Events as scoreable # ??? # Start [[Packaging Your Addon]]" wikitext text/x-wiki == Adding Versus to your map in 5 easy steps == You should have an existing Scenario, if not see [[Setting up a Scenario]] # Duplicate your existing Scenario, Make sure to change the ID. # Set the GameType to Versus, NumSurvivors to 8, and the GameRules to VersusGameRulesBP, # Go through and Mark Special Events as scoreable # ??? # Start [[Packaging Your Addon]] 79ad7c5e29c5a157476020b35629e560ee2b1557